[Python-de] problem beim importieren

Bastian Venthur expires-2007 at venthur.de
Don Feb 23 18:15:42 CET 2006


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.html
> 
> 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