__package__ ist beim Import eines Python-Moduls keine

Ich möchte die Module dynamisch wie folgt importieren:

Ich schaffe einen Ordner namens pkg mit dieser Struktur:

pkg |__init__.py |foo.py 

Im Kopf von __init__.py , füge diesen Code Fragement hinzu:

 pkgpath = os.path.dirname(pkg.__file__); for module in pkgutil.iter_modules([pkgpath]): __import__(module[1], locals(), globals()); m = sys.modules[module[1]]; print m.__package__; 

Ich fand m.__package__ ist None für den Fall gibt es keine Import-Anweisungen in foo.py aber wenn ich eine einfache Import-Anweisung wie folgt hinzufügen:

 import os 

Dann ist m.__package__ "pkg", was der richtige Paketname ist. Warum das passiert?

Wie man ein Modul importiert und sein korrektes Paketattribut sichert?

One Solution collect form web for “__package__ ist beim Import eines Python-Moduls keine”

Das Attribut __package__ , wie Sie bemerkt haben, ist nicht konsequent gesetzt. (Weitere Informationen unten). Allerdings sollten Sie immer in der Lage sein, den Paketnamen zu erhalten, indem Sie alles vor der letzten Periode in einem Modul __name__ Attribut nehmen. Z.B. mymod.__name__.rpartition('.')[0] . Für Ihren Zweck aber ist es wahrscheinlich einfacher, nur die Paket- / Modulhierarchie zu bauen, während Sie die Module laden.

Zum Beispiel ist hier eine Funktion, die alle Module innerhalb eines Pakets lädt, rekursiv Module in Unterpaketen, etc. (ich nehme hier an, dass es dir nichts ausmacht Funktionen mit Nebenwirkungen ..)

 import sys import pkgutil from os.path import dirname def loadModules(pkg): pkg._modules = [] pkgname = pkg.__name__ pkgpath = dirname(pkg.__file__) for m in pkgutil.iter_modules([pkgpath]): modulename = pkgname+'.'+m[1] __import__(modulename, locals(), globals()) module = sys.modules[modulename] module._package = pkg # module._packageName = pkgname pkg._modules.append(module) if dirname(module.__file__) == pkgpath: module._isPackage = False else: module._isPackage = True loadModules(module) def modName(mod): return mod.__name__.rpartition('.')[-1] def printModules(pkg, indent=0): print '\t'*indent, modName(pkg), ':' indent += 1 for m in pkg._modules: if m._isPackage: printModules(m, indent) else: print '\t'*indent, modName(m) import dummypackage loadModules(dummypackage) printModules(dummypackage) 

Probenausgabe:

 dummypackage : modx mody pack1 : mod1 pack2 : mod2 

Mehr Informationen:

Das Attribut __package__ wird intern vom Import-System verwendet, um einfache relative Importe innerhalb eines Pakets zu ermöglichen. Näheres siehe PEP 366 . Um (vermutlich) Zeit beim Laden von Modulen zu sparen, wird das Attribut nur gesetzt, wenn das geladene Modul ein anderes Modul importiert.

  • Wie kann ich auf das aktuelle Ausführungsmodul oder den Klassennamen in Python zugreifen?
  • Wie man Python Callbacks mit Fortran mit Modulen aussetzt
  • Wie ändere ich einen Python-Modulnamen?
  • Installiere das Python-Modul mit einer Zip-Datei
  • Python: Installieren Sie ein Modul aus dem Quellcode
  • Parse a cron Eintrag in Python
  • Überprüfen Sie, ob das Modul vorhanden ist, wenn es nicht in Python installiert ist
  • Wie bekomme ich Python, um das Modul von $ HOME / lib / python über / usr / lib / python zu bevorzugen?
  • Wie benutzt man importlib, um Module aus beliebigen Quellen zu importieren?
  • Pyinstaller Activex Attribut Fehler mit wxPython
  • Was könnte dazu führen, dass ein Python-Modul zweimal importiert wird?
  • Python ist die beste Programmiersprache der Welt.