Grundsätzlich habe ich ein Unterpaket mit dem gleichen Namen wie ein Standard-Bibliothekspaket ("logging") und ich möchte, dass es das Standard-Programm absolut importieren kann, egal wie ich es ausführe, aber das scheitert, wenn ich bin im übergeordneten Paket.
Es sieht wirklich wie ein Fehler aus, oder ein undokumentiertes Verhalten der neuen "absoluten Import" Unterstützung (neu ab Python 2.5). Versucht mit 2.5 und 2.6.
Paketlayout:
%Vor% In foo/__init__.py
importieren wir unser eigenes Logging-Unterpaket:
In foo/logging/__init__.py
möchten wir das Paket stdlib logging
importieren:
Hinweis: Der Ordner mit foo
befindet sich in sys.path.
Wenn die Ausgabe von außerhalb / über foo
erfolgt, ist die Ausgabe wie erwartet:
So findet der absolute Import im Unterpaket das stdlib-Paket wie gewünscht.
Aber wenn wir uns im foo
-Ordner befinden, verhält es sich anders:
Die doppelte Ausgabe von "sub, name" zeigt, dass mein eigenes Unterpaket namens "logging" sich selbst ein zweites Mal importiert und das Paket "logging" stdlib nicht findet, obwohl "absolute_import" aktiviert ist / em>.
Der Anwendungsfall ist, dass ich in der Lage sein möchte, mit diesem Paket zu arbeiten, es zu testen, usw., unabhängig davon, was das aktuelle Verzeichnis ist. Den Namen von "Logging" in etwas anderes zu ändern, wäre ein Workaround, aber kein wünschenswerter, und in jedem Fall scheint dieses Verhalten nicht mit der Beschreibung zu passen, wie absolute Importe funktionieren sollten.
Irgendwelche Ideen, was passiert, ob das ein Fehler ist (meiner oder Pythons), oder ob dieses Verhalten tatsächlich von irgendeiner Dokumentation impliziert wird?
Bearbeiten: Die Antwort von gahooa zeigt deutlich, was das Problem ist. Ein grober Work-Around, der beweist, dass es hier gezeigt wird:
%Vor% sys.path[0]
ist standardmäßig ''
, was "aktuelles Verzeichnis" bedeutet. Wenn Sie also in einem Verzeichnis mit logging
sitzen, wird das zuerst ausgewählt.
Ich habe das erst kürzlich gesehen, bis ich merkte, dass ich tatsächlich in diesem Verzeichnis saß und dass sys.path
mein aktuelles Verzeichnis FIRST aufnahm, bevor ich in die Standardbibliothek schaute.