
Hallo Liste, ich hab hier ein (Anfänger)Problem beim Importieren. Meine Verzeichnisstruktur sieht so aus: . `-- src |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py und die src/p2/main.py so: #!/usr/bin/env python from p1 import foo [...] Ich möchte also von p1/main.py aus p2/foo.py importieren. Wenn ich nun in src python p2/main.py ausführe bekomme ich: src$ python p2/main.py Traceback (most recent call last): File "p2/main.py", line 3, in ? from p1 import foo ImportError: No module named p1 Ich würde also gerne wissen wie ich von p2/main.py aus p1/foo.py importieren kann. Ich hab gelesen, dass dieses Problem im Januar schon mal gefragt wurde, aber das scheint hier nicht zu helfen. Ich habe schon relativ viel rumprobiert, z.B. eine __init__.py in src anzulegen und dann versucht mit import src.p1.foo, bzw. from src.p1 import foo und vielen anderen Permutationen. Langsam geht mir aber die Puste aus. Schöne Grüße Bastian _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Hallo, erweitere mal die (System-)Umgebungsvariable "PYTHONPATH" um Dein Verzeichnis "p1" (unter Unix also z.B. auf der Kommandozeile "export PYTHONPATH=$PYTHONPATH:/home/xyz/src/p1") und schreibe dann im Skript "main.py" einfach "import foo". Sollte funktionieren. MfG, Patrick Holz Bastian Venthur wrote:
Hallo Liste,
ich hab hier ein (Anfänger)Problem beim Importieren. Meine Verzeichnisstruktur sieht so aus:
. `-- src |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py
und die src/p2/main.py so:
#!/usr/bin/env python
from p1 import foo
[...]
Ich möchte also von p1/main.py aus p2/foo.py importieren.
Wenn ich nun in src python p2/main.py ausführe bekomme ich:
src$ python p2/main.py Traceback (most recent call last): File "p2/main.py", line 3, in ? from p1 import foo ImportError: No module named p1
Ich würde also gerne wissen wie ich von p2/main.py aus p1/foo.py importieren kann.
Ich hab gelesen, dass dieses Problem im Januar schon mal gefragt wurde, aber das scheint hier nicht zu helfen.
Ich habe schon relativ viel rumprobiert, z.B. eine __init__.py in src anzulegen und dann versucht mit import src.p1.foo, bzw. from src.p1 import foo und vielen anderen Permutationen. Langsam geht mir aber die Puste aus.
Schöne Grüße
Bastian
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
_______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Patrick Holz wrote:
Hallo,
erweitere mal die (System-)Umgebungsvariable "PYTHONPATH" um Dein Verzeichnis "p1" (unter Unix also z.B. auf der Kommandozeile "export PYTHONPATH=$PYTHONPATH:/home/xyz/src/p1") und schreibe dann im Skript "main.py" einfach "import foo". Sollte funktionieren.
MfG, Patrick Holz
Hi, da src in dem Beispiel das "Basisverzeichnis" ist hab ich den PYTHONPATH nur bis src erweitert und in den Quellen import p1.foo gemacht. Soweit funktioniert das auch. Danke für den Hinweis. Aber eine Frage bleibt: Ist das normal? Wenn ich innerhalb von src python starte dann kann ich auch import p1.foo machen ohne dass python meckert. Warum klappt nicht src$ python p2/main.py Ich kann mir denken, dass python dann scheinbar in src/p2 gestartet wird, so dass es die Verzeichnisse darüber nicht sieht. Aber wie bekomme ich python dazu dass es in scr startet und p2/main.py startet? (Ich hoffe das ist nicht zu verwirrend erklärt). Schöne Grüße Bastian _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 23.02.06 17:50:21, Bastian Venthur wrote:
Patrick Holz wrote: Aber eine Frage bleibt: Ist das normal?
Ich schaetze: Ja.
Wenn ich innerhalb von src python starte dann kann ich auch import p1.foo machen ohne dass python meckert. Warum klappt nicht
src$ python p2/main.py
Ich schaetze die Antwort darauf findest du in der Python Doku - Library Reference - System specific parameters unter "sys.path".
Ich kann mir denken, dass python dann scheinbar in src/p2 gestartet wird, so dass es die Verzeichnisse darüber nicht sieht.
Python nciht, aber das Skript.
Aber wie bekomme ich python dazu dass es in scr startet und p2/main.py startet? (Ich hoffe das ist nicht zu verwirrend erklärt).
Schreib den Code in p2/main.py in eine Funktion, schreib ein Skript main.py in src das aus p2.main die Funktion importiert und fuehre die Funktion aus wenn __name__ == "__main__" Andreas -- Cold hands, no gloves. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Andreas Pakulat wrote:
Aber wie bekomme ich python dazu dass es in scr startet und p2/main.py startet? (Ich hoffe das ist nicht zu verwirrend erklärt).
Schreib den Code in p2/main.py in eine Funktion, schreib ein Skript main.py in src das aus p2.main die Funktion importiert und fuehre die Funktion aus wenn __name__ == "__main__"
Zugegeben src/p1/main.py ist etwas konfus, aber das sollte auch nur ein quick-and-dirty test sein wir das mit Packages funktioniert. Es handelt sich hierbei nicht um das Hauptprogramm sondern könnte auch einfach ein Modul/Libary sein die auf ein Schwesterpaket zugreifen muss. Die Libary von source aus aufzurufen würde mein Probel nicht lösen. Schöne Grüße Bastian _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 23.02.06 21:17:37, Bastian Venthur wrote:
Andreas Pakulat wrote:
Aber wie bekomme ich python dazu dass es in scr startet und p2/main.py startet? (Ich hoffe das ist nicht zu verwirrend erklärt).
Schreib den Code in p2/main.py in eine Funktion, schreib ein Skript main.py in src das aus p2.main die Funktion importiert und fuehre die Funktion aus wenn __name__ == "__main__"
Zugegeben src/p1/main.py ist etwas konfus, aber das sollte auch nur ein quick-and-dirty test sein wir das mit Packages funktioniert. Es handelt sich hierbei nicht um das Hauptprogramm sondern könnte auch einfach ein Modul/Libary sein die auf ein Schwesterpaket zugreifen muss.
Dann pack das ganze wie es sich fuer eine Lib gehoert in site-packages. Oder wenn du noch am Entwickeln bist setze PYTHONPATH, bzw. nutze das .pth-File oder veraender sys.path selbst.
Die Libary von source aus aufzurufen würde mein Probel nicht lösen.
Doch wuerde es, weil dann der src-Ordner in sys.path waere und somit from p1 import main funktionieren wuerde. Andreas -- You will probably marry after a very brief courtship. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Donnerstag, 23. Februar 2006 15:07 schrieb Bastian Venthur: Moin Bastian,
ich hab hier ein (Anfänger)Problem beim Importieren. Meine Verzeichnisstruktur sieht so aus:
. `-- src
aus deiner Schilderung des Problems werde ich nicht ganz schlau. Deshalb werde ich mal ein kleines Beispiel zum Thema Importieren bringen was Dich vielleicht auf den richtigen Weg bringt. Du hast folgende Verzeichnis Struktur: Wurzel Verzeichnis: programm In "programm" ist das Unterverzeichnis: app darin wiederum ist das Unterverzeichnis: cgi Das ganze sieht also so aus "./programm/app/cgi. In "programm" ist die Pythondatei main.py. In "app" die Pythondatei "filter.py" und in "cgi" die Pythondatei main_cgi.py". Wenn Du jetzt in app und cgi eine __init__.py hast dann kannst Du folgendes machen Aus main.py import app.filter.Klassenname # Paket: app Modul: filter Klasse: Klassenname import app.cgi.main_cgi.Klassenname # Paket: app Paket: cgi Modul: main_cgi Klasse: Klassenname import cgi.main_cgi.Klassenname # Paket: cgi Modul: main_cgi Klasse: Klassenname Du kannst also nur Module/Pakete (Verzeichnis mit einer __init__.py) importieren wenn dieses ein Unterverzeichnis ist. Du kannst nicht so einfach aus app.filter eine Klasse aus programm main.py importieren. Möchtest Du das dann musst Du Python das Verzeichnis programm erst bekannt machen. Wie das geht steht im Beitrag aus Januar. Ich hoffe das hat Dich weiter gebracht :-) MfG Albert _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Halo Bastian, At 15:07 23.02.2006, you wrote:
Hallo Liste,
ich hab hier ein (Anfänger)Problem beim Importieren. Meine Verzeichnisstruktur sieht so aus:
. `-- src |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py
und die src/p2/main.py so:
#!/usr/bin/env python
from p1 import foo
[...]
Ich möchte also von p1/main.py aus p2/foo.py importieren.
Anders herum? von p2/main.py aus p1/foo.py importieren
Wenn ich nun in src python p2/main.py ausführe bekomme ich:
src$ python p2/main.py Traceback (most recent call last): File "p2/main.py", line 3, in ? from p1 import foo ImportError: No module named p1
Ich würde also gerne wissen wie ich von p2/main.py aus p1/foo.py importieren kann.
Ich hab gelesen, dass dieses Problem im Januar schon mal gefragt wurde, aber das scheint hier nicht zu helfen.
Ich habe schon relativ viel rumprobiert, z.B. eine __init__.py in src anzulegen und dann versucht mit import src.p1.foo, bzw. from src.p1 import foo und vielen anderen Permutationen. Langsam geht mir aber die Puste aus.
Dein Modul muss im PYTHONPATH stehen. Das aktuelle Arbeitsverzeichnis gehört offensichtlich nicht dazu. Ich kenne 4 verschiedene Methoden das zu erreichen: 1.) p1 einfach in das Verzeichnis Python2x/Lib/site-packages kopieren, 2.) eine Datei p1.pth unter site-packages mit Inhalt "/../src/p1" erstellen, 3.) in main.py den Pfad per sys.path.append('/.../src') dynamisch hinzufügen oder 4.) Die Umgebungsvariable PYTHONPATH setzen z.B.: export PYTHONPATH=$PYTHONPATH:/.../src Alle Methoden haben etwas unterschiedliche Anwendungsfelder, je nachdem was du willst. In das Verzeichnis site-packes würde ich zum Beispiel nur kopieren, wenn das Modul (vorerst) fertig ist. sys.path.append ist sehr dynamisch lässt sogar ein programmatisches Setzen des Pythonpfades zu. Die *.pth-Datei ist auch recht elegant. Das Setzen von PYTHONPATH in der Shell funktioniert wie die Handhabung von Umgebungsvariable PATH. Siehe auch http://www.python.org/doc/tut/node8.html oder in Deutsch http://starship.python.net/crew/gherman/publications/tut-de/online/tut/node8... Hoffe es hilft weiter. Mike _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Mike Mueller wrote:
Halo Bastian,
At 15:07 23.02.2006, you wrote:
Hallo Liste,
ich hab hier ein (Anfänger)Problem beim Importieren. Meine Verzeichnisstruktur sieht so aus:
. `-- src |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py
und die src/p2/main.py so:
#!/usr/bin/env python
from p1 import foo
[...]
Ich möchte also von p1/main.py aus p2/foo.py importieren.
Anders herum?
von p2/main.py aus p1/foo.py importieren
Jupp, recht haste :)
Dein Modul muss im PYTHONPATH stehen. Das aktuelle Arbeitsverzeichnis gehört offensichtlich nicht dazu. Ich kenne 4 verschiedene Methoden das zu erreichen:
1.) p1 einfach in das Verzeichnis Python2x/Lib/site-packages kopieren, 2.) eine Datei p1.pth unter site-packages mit Inhalt "/../src/p1" erstellen, 3.) in main.py den Pfad per sys.path.append('/.../src') dynamisch hinzufügen oder 4.) Die Umgebungsvariable PYTHONPATH setzen z.B.: export PYTHONPATH=$PYTHONPATH:/.../src
Alle Methoden haben etwas unterschiedliche Anwendungsfelder, je nachdem was du willst. In das Verzeichnis site-packes würde ich zum Beispiel nur kopieren, wenn das Modul (vorerst) fertig ist. sys.path.append ist sehr dynamisch lässt sogar ein programmatisches Setzen des Pythonpfades zu. Die *.pth-Datei ist auch recht elegant. Das Setzen von PYTHONPATH in der Shell funktioniert wie die Handhabung von Umgebungsvariable PATH.
Danke für die Hilfe, ich werd's wohl vorerst mit dem PYTHONPATH halten. Aber trotzdem verstehe ich nicht, warum meine ursprüngliche Idee nicht funktioniert. Laut deiner Quellen, dich heute vormittag bestimmt 20mal gelesen hab ;)
http://www.python.org/doc/tut/node8.html
oder in Deutsch
http://starship.python.net/crew/gherman/publications/tut-de/online/tut/node8...
Hoffe es hilft weiter.
Sollte es eigentlich ohne irgendwelche Tricks funktionieren. Siehe 6.4.2 "Intra-package References": When packages are structured into subpackages (as with the Sound package in the example), there's no shortcut to refer to submodules of sibling packages - the full name of the subpackage must be used. For example, if the module Sound.Filters.vocoder needs to use the echo module in the Sound.Effects package, it can use from Sound.Effects import echo. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Sound/ Top-level package __init__.py Initialize the sound package Formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... Effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... Filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ... Schöne Grüße Bastian _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

. `-- src |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py
Ich sehe hier zwei packages, p1 und p2, die zufällig in einen Pfad liegen, wo auch noch zufällig main.py liegt. Anders dagegen bei dem Beispiel aus der Doku.
Sound/ Top-level package __init__.py Initialize the sound package Formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... Effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... Filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ...
Ich sehe hier EIN package Sound mit subpackges Formats, Effects und Filters. So sollte z.B. import Sound.Filters.equalizer as equi funktionieren. Um dein Beispiel nun genauso funktionieren zu lassen, müsste meiner Meinung nach noch eine __init__.py in src hinzukommen, damit src zum package mit den subpackages p1 und p1 wird.
Ich habe schon relativ viel rumprobiert, z.B. eine __init__.py in src anzulegen und dann versucht mit import src.p1.foo, bzw. from src.p1 import foo ...
War schon richtig. Ich glaube src muss aber trotzdem im PYTHONPATH liegen um dann import src.p1.foo as foo schreiben zu können. ******* WICHTIG ******* Aus dem *übergeordneten* Verzeichnis von src sollte es dann aber *ohne* PYTHONPATH funktionieren. Python sucht dann im aktuellen Pfad und findet das package src und kann mit voll qualifiziertem Import darauf zugreifen. Hier liegt meiner Meinung nach das Problem:
Wenn ich nun in src python p2/main.py ausführe bekomme ich:
cd .. python src/p2/main.py sollte hier eigentlich Abhilfe schaffen (vorausgesetzt eine __init__.py liegt in src). Klappt's? Mike _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Mike Mueller wrote:
Ich sehe hier zwei packages, p1 und p2, die zufällig in einen Pfad liegen, wo auch noch zufällig main.py liegt.
Anders dagegen bei dem Beispiel aus der Doku.
Ich sehe hier EIN package Sound mit subpackges Formats, Effects und Filters. So sollte z.B.
import Sound.Filters.equalizer as equi
funktionieren.
Um dein Beispiel nun genauso funktionieren zu lassen, müsste meiner Meinung nach noch eine __init__.py in src hinzukommen, damit src zum package mit den subpackages p1 und p1 wird.
Aus dem *übergeordneten* Verzeichnis von src sollte es dann aber *ohne* PYTHONPATH funktionieren. Python sucht dann im aktuellen Pfad und findet das package src und kann mit voll qualifiziertem Import darauf zugreifen.
Hier liegt meiner Meinung nach das Problem:
cd .. python src/p2/main.py
sollte hier eigentlich Abhilfe schaffen (vorausgesetzt eine __init__.py liegt in src).
Klappt's?
Leider nicht :( Ich hab __init__.py in src hinzugefügt und im Oberverzeichniss von src das moduld aufgerufen. Der fehler bleibt der gleiche: $ tree . `-- src |-- __init__.py |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py $ python src/p2/main.py Traceback (most recent call last): File "src/p2/main.py", line 4, in ? import src.p1.foo ImportError: No module named src.p1.foo Das sollte jetzt extakt das gleiche Szenario wie im Beispiel sein -- warum es nicht funktioniert ist mir schleierhaft. Schöne Grüße Bastian _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

On 23.02.06 19:52:36, Mike Mueller wrote:
Hier liegt meiner Meinung nach das Problem:
Alles andere was du gesagt hast war soweit korrekt, aber hier kommt dein Fehler:
Wenn ich nun in src python p2/main.py ausführe bekomme ich:
cd .. python src/p2/main.py
sollte hier eigentlich Abhilfe schaffen (vorausgesetzt eine __init__.py liegt in src).
Das kann nicht klappen, da Python das Verzeichnis zu sys.path hinzufuegt in dem das Skript welches gestartet wird liegt, in diesem Fall also $PWD/src/p2. Von dort siehst du die anderen Packages nicht. Wenn man aus src ein Package mit subpackages macht muss das aufgerufene Skript oberhalb von src liegen. Wenn man es in src packt kann man sich das __init__.py sparen und p1 wird als Package gefunden. Wo genau das nachzulesen ist (Python Library reference Punkt 3) hatte ich schon in nem anderen Teilthread gesagt. Andreas -- Give him an evasive answer. _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Andreas Pakulat wrote:
Wenn man aus src ein Package mit subpackages macht muss das aufgerufene Skript oberhalb von src liegen. Wenn man es in src packt kann man sich das __init__.py sparen und p1 wird als Package gefunden.
Wo genau das nachzulesen ist (Python Library reference Punkt 3) hatte ich schon in nem anderen Teilthread gesagt.
Danke dir, jetzt hab ich das Problem verstanden :) Und das Problem ist damit gelöst. Schöne Grüße Bastian _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Bastian Venthur schrieb:
Verzeichnisstruktur sieht so aus:
. `-- src |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py
Ich möchte also von p1/main.py aus p2/foo.py importieren.
Wenn ich nun in src python p2/main.py ausführe bekomme ich:
src$ python p2/main.py Traceback (most recent call last): File "p2/main.py", line 3, in ? from p1 import foo ImportError: No module named p1
Was sagt denn src$ PYTHENPATH=".:$PYTHONPATH" python p2/main.py ? Und was spuckt das hier aus: src$ strace python p2/main.py 2>&1 | fgrep foo ? Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Stefan Behnel wrote:
Bastian Venthur schrieb:
Verzeichnisstruktur sieht so aus:
. `-- src |-- main.py |-- p1 | |-- __init__.py | `-- foo.py |-- p2 | |-- __init__.py | `-- main.py `-- unittest `-- footest.py
Ich möchte also von p1/main.py aus p2/foo.py importieren.
Wenn ich nun in src python p2/main.py ausführe bekomme ich:
src$ python p2/main.py Traceback (most recent call last): File "p2/main.py", line 3, in ? from p1 import foo ImportError: No module named p1
Was sagt denn src$ PYTHENPATH=".:$PYTHONPATH" python p2/main.py
Das macht genau, was ich erwarte -- nur sollte es doch auch ohne PYTHONPATH klappen oder?
Und was spuckt das hier aus: src$ strace python p2/main.py 2>&1 | fgrep foo
Nicht viel: src$ strace python p2/main.py 2>&1 | fgrep foo write(2, "import p1.foo\n", 14import p1.foo write(2, "No module named p1.foo", 22No module named p1.foo) = 22 Schöne Grüße Bastian _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (6)
-
Albert Hermeling
-
Andreas Pakulat
-
Bastian Venthur
-
Mike Mueller
-
Patrick Holz
-
Stefan Behnel