Warum sind Module im PYTHONPATH nicht gefunden werden, wenn das übergeordnete Verzeichnis ist Teil der PYTHONPATH und die Datei vorhanden ist?
Habe ich folgende situation (Verifizierung durch die Befehle unten):
- vorhandenen python-Skript-Datei in Verzeichnis x
- vorhandenen python-cat
__init__.py
Datei in x - x Hinzugefügt
PYTHONPATH
variable availble für beide Benutzer eingeloggt ist, undsudo
und ich aufrufen möchte ~/test.py
mit
#!/usr/bin/python
import sys;print sys.path;
import mount_utils
print "Hello World!"
mit sudo python ~/test.py
die Ursachen
Traceback (most recent call last):
File "/home/richter/test.py", line 3, in <module>
import mount_utils
ImportError: No module named mount_utils
den Verzeichnissen, in PYTHONPATH
sind nicht in sys.path
außer dem aktuellen Verzeichnis. python ~/test.py
wie erwartet funktioniert (druckt sys.path
und Hello World!
an die Konsole). sudo -E python ~/test.py
schlägt mit dem gleichen Fehler. Ich verstehe nicht,
- Warum das Modul ist nicht verfügbar, wenn
PYTHONPATH
variable printed insudo echo
Ausgabe - Warum
sudo -E
nicht die Umwelt zu schonen (soweit ich das verstanden habe ausman sudo
und https://docs.python.org/2/using/cmdline.html es sollte kein Unterschied zwischenpython bla
undsudo -E python bla
)
Warum erhalte ich diese Fehlermeldung?
Überprüfung der situation im detail:
$ env | grep PYTHONPATH
PYTHONPATH=:/home/richter/scripts/python:/home/richter/scripts/python/installsystem:/home/richter/scripts/python/lib
$ sudo env | grep PYTHONPATH
$ LANG=C stat /home/richter/scripts/python/lib/mount_utils.py
File: '/home/richter/scripts/python/lib/mount_utils.py'
Size: 8374 Blocks: 24 IO Block: 4096 regular file
Device: 80ch/2060d Inode: 20972052 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ richter) Gid: ( 1000/ richter)
Access: 2014-08-19 17:06:37.542787417 +0200
Modify: 2014-07-31 10:54:14.709468668 +0200
Change: 2014-07-31 10:54:14.729478917 +0200
Birth: -
$ LANG=C stat /home/richter/scripts/python/lib/__init__.py
File: '/home/richter/scripts/python/lib/__init__.py'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 80ch/2060d Inode: 20972114 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ richter) Gid: ( 1000/ richter)
Access: 2014-08-09 19:49:44.345055332 +0200
Modify: 2014-05-07 06:57:31.434851243 +0200
Change: 2014-06-25 03:17:29.569551147 +0200
Birth: -
Habe ich nicht bekommen eine Idee von der ganz ähnlichen Frage unbeantwortet Warum PYTHONPATH ignoriert?
EDIT 1: Nach Berücksichtigung Wie legen Sie die Umgebungsvariable für alle unter meinem linux-system? und die Tatsache, dass echo ...
ist ein eher schlechter Weg, um sicherzustellen, ob env-Variablen gesetzt sind, setze ich export PYTHONPATH="$PYTHONPATH:/home/richter/scripts/python:/home/richter/scripts/python/installsystem:/home/richter/scripts/python/lib"
im
/etc/profile
/etc/profile.d/python_py.sh
/root/.bashrc
/home/richter/.bashrc
und jetzt PYTHONPATH
ist (zusätzlich zu der oben beschriebenen situation) im env
im sudo -i
prompt, aber nicht in sudo env | grep PYTHONPATH
. sudo python test.py
immer noch nicht wegen dem gleichen Fehler, also meine Probleme bleibt.
Auch export PYTHONPATH="/home/richter/scripts/python:/home/richter/scripts/python/installsystem:/home/richter/scripts/python/lib" && sudo -E python test.py
scheitert an den gleichen Fehler.
InformationsquelleAutor Karl Richter | 2014-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie Ihre
PYTHONPATH
- Umgebungsvariable, um die sudoers -env_keep
.Ausführen:
sudo visudo
(öffnet das/etc/sudoers
- Datei in einer sicheren Art und Weise).Fügen Sie diese Zeile:
Defaults env_keep += "PYTHONPATH"
.Nun
:wq
, und bewahrt diePYTHONPATH
variable beim ausführensudo
Importing test modules ... PYTHONPATH not found for file: ...
. Ich habe darum gebeten, die detaillierte Frage hierInformationsquelleAutor chown
Könnte es sein, dass die Umwelt sudo ausgeführt wird (root) nicht die
PYTHONPATH
gesetzt?Für diesen Befehl, ich denke, shell-interpolation ist es schlagen vor
sudo
führt, so dass Sie im wesentlichen nur zu schreiben,dem ist wirklich nicht anders zu
Ich kann sehen, denken Sie vielleicht in diese Richtung mit
sudo -E
(obwohl ich konnte nicht sehen, eine bestimmte Ausgabe, für, dass in deinen Beispielen) - ich persönlich habe nicht die Erfahrung mitsudo -E
.Könnten Sie versuchen,
Wo single quotes stop-interpolation, und auch
nur im Fall, wenn Sie mit
sudo -E
es ist wirklich nur das schlagen der shell-interpolation Problem wieder...//diese Vorschläge sind aus Spitze von meinem Kopf, kann Ihre Laufleistung variieren!
sudo 'echo $PYTHONPATH'
nicht funktioniert, aber in der Eingabeaufforderung vonsudo -i
ich sehe, dassecho $PYTHONPATH
leer ist. Vielen Dank für deinen input.InformationsquelleAutor Matt Warren