Ich frage mich, warum virtualenv den Ordner DLLs
nicht auf dieselbe Weise erstellt, wie er Lib
und Scripts
eins erstellt?
Die Frage kam zu mir, als ich das folgende Problem mit PyDev hatte:
Ich habe einen meiner Virtualenvs als Python-Interpreter eingestellt und alles war ok mit einer Ausnahme. Ich habe Warnungen über nicht aufgelösten Import für alle Importe von select
-Modul erhalten. Dies liegt daran, dass select
-Modul im Gegensatz zu den meisten anderen nur im DLLs-Ordner vorhanden ist.
Ich habe dieses Thema etwas genauer untersucht. Ich habe mit techtoniks Anweisung angefangen - Die Antwort ist einfach - niemand hat sie implementiert. Dies wirft jedoch eine andere Frage auf - warum niemand sie implementiert hat? Ich vermute, die Antwort ist, weil es funktioniert. Dies führt zu einer weiteren Frage - warum funktioniert es?
Der Grund, warum alles funktioniert, ohne dass DLLs
Ordner in virtualenv kopiert wird, ist
sys.path
, um eine DLL zu finden, die es braucht sys.path
nach Aktivierung von virtualenv enthält den Pfad zum ursprünglichen DLLs
Ordner Die erste Anweisung kann einfach getestet werden, indem der Pfad zum DLLs
Ordner von sys.path
entfernt wird und versucht wird, select
module zu importieren (dieses Modul benötigt select.pyd
file von DLLs
Ordner), was dann fehlschlägt.
In dem Kommentar, den Sie sagen, möchte ich die DLLs des Python-Moduls zusammen mit dem Python-Code in der virtuellen Umgebung behalten. Das ist möglich, indem Sie einfach DLLs
-Ordner in virtualenv kopieren. Der Grund dafür ist, dass sys.path
nach der Aktivierung von virtualenv auch den Pfad zum Ordner DLLs
innerhalb von virtualenv enthält (obwohl beim Erstellen von virtualenv kein solcher Ordner erstellt wird). Dieser Pfad wird vor dem Pfad zum ursprünglichen DLLs
-Ordner platziert, was bedeutet, dass er zuerst durchsucht wird und somit den ursprünglichen DLLs
-Ordner außer Kraft setzt.
Ich habe eine Frage mit dem Titel DLLs-Ordner unter Windows in der Python-Mailingliste gepostet.
Die Antwort ist einfach - niemand hat es implementiert. Als ich den Patch erstellt habe, um pythonXX.dll in die virtualenv-Umgebung zu kopieren, habe ich ein anderes Problem gelöst:
Wenn Python systemweit installiert ist - die python.exe-Binärdatei, die nach virtualenv kopiert wird, kann immer ihre pythonXX.dll finden, weil diese .dll von Windows \ System32 verfügbar ist. Wenn Python nur für den aktuellen Benutzer installiert ist, wird pythonXX.dll in PythonXX dir platziert, wo sich original python.exe befindet. Also das Problem, das ich gelöst habe, ist, virtualenvs zu reparieren, die mit Python erstellt wurden, das für den aktuellen Benutzer installiert ist. Es war ein ziemliches Problem, all das Zeug auszugraben.
Zurück zur Frage. Ich weiß nicht wirklich, wie diese pythonXX.dll ihre DLLs-Module findet - das ist eine Frage an Python-Entwickler, aber ich vermute, dass sie sie nicht findet. Der Grund, warum ich dieses Problem nicht behoben habe, während ich # 87 behoben habe, ist, dass mein Code wahrscheinlich nie Module von verwendet hat Dieses DLLs-Verzeichnis.
IMO gibt es mehr Gründe dafür:
HTH,
Tags und Links python dll windows virtualenv pydev