Die Python Cookbook schlägt folgende Baumstruktur für ein „typisches Bibliothekspaket“:Wie fügt man Beispiele oder Testprogramme in ein Paket ein?
projectname/
README.txt
Doc/
documentation.txt
projectname/
__init__.py
foo.py
bar.py
utils/
__init__.py
spam.py
grok.py
examples/
helloworld.py
Sie werden bemerkt, dass die examples/
nicht Teil des eigentlichen Pakets sind, die unter projectname/projectname/
befindet (das ist, wo Sie ' Ich finde die oberste Ebene __init__.py
des Pakets).
Nun, examples/helloworld.py
muss offensichtlich das projectname
Paket importieren.
Ich bin mir bewusst, dass es in StackOverflow mindestens 2-3 relevante Fragen gibt. Ich glaube nicht, dass dies ein Duplikat ist, weil die anderen Fragen entweder Intrapaket-Importe oder den allgemeinen Fall des Imports eines Python-Moduls von einem anderen beinhalten, wenn sie nicht im selben Verzeichnis liegen. Ich frage speziell nach dem vorgeschlagenen Weg, dies beim Verpacken einer Bibliothek zu tun.
Gibt es eine Möglichkeit, dies zu erreichen, ohne den Pfad zu ändern? Wenn nur der Pfad geändert werden kann, gibt es einen Weg, dies auf elegante Weise zu tun?
Lassen Sie mich auf diesen letzten Punkt näher eingehen. In Repository Structure and Python von Kenneth Reitz erscheint eine ähnliche Struktur mit tests/
anstelle von examples/
. Das ist genau das gleiche Problem. Er schlägt vor, "eine einfache (aber explizite) Pfadänderung zu verwenden, um das Paket richtig aufzulösen." OK, aber das ist der eigentliche Code:
import os
import sys
sys.path.insert(0, os.path.abspath('..'))
ich den ..
Teil wirklich nicht mag. Ich hoffe auf eine allgemeinere Lösung, hoffentlich eine, die von dem Verzeichnis funktionieren würde, das ich wählen würde, um das Beispiel (oder den Test) auszuführen.
Sie meinen, anders als einen relativen Pfad in einem Import zu verwenden oder das zu importierende Modul explizit zu übergeben? Wenn Projektname ein Paket ist, können Sie es immer nur explizit importieren, nachdem es installiert wurde. In Tests ist dies normalerweise das, was Sie tun. Fehle ich etwas in deiner Frage? – nir0s
Wie funktioniert "Verwenden eines relativen Pfads in einem Import oder explizites Übergeben des zu importierenden Moduls"? Was wäre die Importlinie für zum Beispiel '' examples/helloworld.py''? Weil ich nicht in der Lage war, es zum Laufen zu bringen ... Was den anderen Vorschlag betrifft, erwähnt Kenneth Reitz auch "Erwarten Sie, dass das Paket in den Aufstellungsortpaketen installiert wird" als eine Alternative, aber widerspricht es. –
Ich muss dann falsch verstanden werden. Sie möchten etwas aus 'Beispielen' importieren? Wenn ja, warum ist es kein Paket? – nir0s