2017-11-30 12 views
5

Also, ich spiele herum mit dem Paketieren eines Python-Skripts, das ich geschrieben habe, und es hat ein Submodul, nennen wir es submodule. Die Ordnerstruktur sieht wie folgt aus:Python kann ein Modul importieren, das nicht installiert ist

cool_script/ 
    setup.py 
    cool_script.py 
    submodule/ 
    __init__.py 
    implementation.py 

Jetzt, nach vielen pip install . und pip install -e . Anrufe, ich habe die Situation, in der submodule global importiert werden können. Egal, wo auf meinem System, das funktioniert immer:

$ python3 
[...] 
>>> import submodule 
>>> submodule.__file__ 
'/home/me/fake/path/cool_script/submodule/__init__.py' 

Aber ich weiß nicht, warum.

Das Paket, das ich gemacht habe, wurde wieder deinstalliert, und pip kann das Submodul in seinem Index nicht finden. Es gibt nichts in dist-Pakete entweder, ich gelöscht manuell die cool_script.egg-link, die noch saß da ​​herum:

$ ls /usr/local/lib/python3.4/dist-packages | ack cool 
$ ls /usr/local/lib/python3.4/dist-packages | ack submodule 
$ 

Die PYTHONPATH leer ist auch:

$ echo $PYTHONPATH 

$ 

Warum Python kennen den Standort von submodule ? Wie kann ich es herausfinden?

+0

Wurde es in einem virtualenv installiert? Ist es ein Linux-System? –

+0

Dies ist ein Linux-System in der Tat, und nein, ich habe diese Experimente auf meiner globalen Umgebung. Ich weiß, das war sehr dumm. Lektion gelernt, denke ich. – iFreilicht

+0

Das klingt vielleicht dumm, aber haben Sie versucht, neu zu starten? Vielleicht ist es irgendwo zwischengespeichert – RunOrVeith

Antwort

3

Zuerst python -c "import site; print(site.getsitepackages())" ausführen. Es wird eine Liste wie folgt drucken:

['/XXX/something/site-packages'] 

Normalerweise ein einzelner Pfad in dieser Liste gibt es, und es zeigt auf ein Verzeichnis, in dem pip Ihre Skripte installiert. Sie können ls hinein, wenn Sie neugierig sind: ls /XXX/something/site-packages/.

Interessantererweise, pip legt eine "Link" -Datei in diesem Verzeichnis, wenn Sie Entwickler installiert (a.k.a. pip install -e). Die "Link" -Datei ist nach dem ursprünglichen Projekt mit einer .egg-link Erweiterung am Ende benannt.

Sie haben wahrscheinlich eine cool_script.egg-link Datei in diesem Verzeichnis. Und wenn Sie versuchen, es auszudrucken, sollten Sie finden, dass sein Inhalt den ursprünglichen Dateisystemstandort Ihres Moduls auflistet. Etwas wie:

$ cat /XXX/something/site-packages/cool_script.egg-link 
/home/me/fake/path/cool_script/ 
. 

Dies ist, wie pip Datensätze, die es etwas im Entwicklermodus installiert ist, aber es ist nicht, wie Python eigentlich weiß, wie Ihr Modul zu finden (das wäre zu einfach, nicht wahr? -)).

Python nicht weiß, über .egg-link Dateien, aber es liest alle .pth Dateien im Verzeichnis site-packages zusätzliche Pfade für sys.path (*) zu erhalten. Damit Python Entwicklerinstallationen importieren kann, schreibt pip alle ihre Pfade in eine einzige .pth Datei, die herkömmlicherweise als easy-install.pth bezeichnet wird (weil das alte easy-install Werkzeug tatsächlich diese Technik eingeführt hat). Und wenn Sie aus dieser Datei drucken, werden Sie die Liste der alle Projekte Pfade im Entwicklermodus installiert bekommen:

$ cat /XXX/something/site-packages/easy-install.pth 
/home/me/fake/path/cool_script/ 
/home/me/another/project/ 

und können Sie überprüfen, ob tatsächlich alle diese Pfade in easy-install.pth aufgeführt in der Tat zu Ihrem hinzugefügt bekommen sys.path .

(*) Technisch ist der Teil von Python, der diese .pth Datei liest, das site Modul, das normalerweise beim Start automatisch importiert wird. Es gibt eine Option, das Modul site zu deaktivieren, zum Beispiel mit python -S. In diesem Fall sehen Sie, dass sys.path weder das Verzeichnis site-packages noch die Installationspfade für Entwickler enthält.

+0

Das war's, der Ordner wurde in 'easy-install.pth' aufgelistet. Das Entfernen hat das Problem gelöst! Danke für die gründliche Erklärung. – iFreilicht

Verwandte Themen