2017-02-08 7 views
1

In der folgenden Struktur:voran PYTHONPATHs nicht in sys.path für Python eingebettet

- foobar 
    - __init__.py 
    - pyfoo 
    - __init__.py 
    - foo.pyd 
    - src 
     - __init__.py 
     - test 
     - __init__.py 
     - bar.py 

Ich versuche foo.pyd von bar.py zu laden. Dazu habe ich einen Eintrag in PYTHONPATH mit \\?\C:\<path_to_foobar>\foobar\pyfoo eingefügt.

In bar.py Ich versuche dann zu

import foo 

, die nie foo findet.

Wenn ich nun sys.path anschaue, fehlen Einträge von PYTHONPATH. Auch wenn ich suche, unter welchen Pfaden foo.pyd gesucht wird, werden nur Pfade von sys.path berücksichtigt.

Wie kommt es, dass sys.path nicht alle Pfade von PYTHONPATH enthält?


EDIT:

die Pfade testen ich direkt vor dem Import eingefügt Protokolle:

print("SP %s" % sys.path) 
print("PP %s" % os.environ["PYTHONPATH"]) 

Was mich so etwas wie gibt:

SP ['\\\\?\\B:\\foobar\\pyfoo\\src\\test', 'C:\\python3\\win_x86_64\\python35.zip', 'C:\\python3\\win_x86_64\\DLLs', 'C:\\python3\\win_x86_64\\lib', 'C:\\python3\\win_x86_64'] 
PP \\?\B:\;\\?\B:\foobar\pyfoo;\\?\B:\foobar;\\?\B:\foobar\pyfoo 
+0

wie haben Sie Ihren PYTHONPATH Eintrag einfügen? Sind Sie sicher, dass die Variable dort definiert ist, wo Sie Ihr Skript ausführen? Sie können PYTHONPATH vor dem Starten des Skripts wiederholen. Offensichtlich fehlt hier ein [mcve]. –

+0

Siehe Bearbeiten, ich spreche nicht nur vorher sondern im Script. – abergmeier

+0

Ich verstehe, dass Sie Ihren Servernamen durch '?' Ersetzt haben. Wenn nicht, gibt es ein erstes Problem: Dies kann kein gültiger Pfad sein. Und der andere Fehler ist das Laufwerk ':' welches im Fall von UNC Pfaden mit Laufwerken '$' sein sollte. Ihre UNC-Pfade scheinen nicht gültig zu sein. –

Antwort

1

nicht Ihr Problem reproduzieren , mit meiner Windows 7-x64 + Python 3.4.4-x64 Version es Werke, die Inhalte von PYTHONPATH vorhanden sind in sys.path:

set PYTHONPATH=\\?\L:\SO 
python 

>>> import sys 
>>> sys.path 
['', '\\\\?\\L:\\SO', ... , 'D:\\Python34-x64\\lib\\site-packages'] 

Das heißt, wie dieses Problem zu umgehen, können Sie den Inhalt von PYTHONPATH in sys.path wie diese zwingen könnte:

import os,sys 
sys.path.extend(os.getenv("PYTHONPATH").split(os.pathsep)) 

# now you can import foo 
import foo 
+0

Können Sie bitte versuchen, ein Skript mit vorangestelltem Pfad aufzurufen? – abergmeier

+0

Welche Windows-Version verwenden Sie? – abergmeier

+0

Windows 7 64-Bit. Welche Version von Python benutzt _you_? –

0

Der Versuch (mit 3.5.2- integrierbare):

set PYTHONPATH=\\?\C:\Windows 

C:\python3.5.2\win_x86_64\python.exe \\?\C:\temp\test.py 

mit test.py:

führt zu \\?\C:\Windows fehlt von sys.path.

Die gleiche Prüfung mit set PYTHONPATH=C:\Windows funktioniert wie ein Charme in 3.5.2-embeddable.

Der gleiche Test mit 3.6.0-embeddable fügt in keinem Fall sys.path hinzu.

Und 3.6.0-integrierbare scheint, wie das gewünschte Verhalten https://bugs.python.org/issue28245

Verwandte Themen