Warum erstellt virtualenv DLLs Ordner nicht?

8

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.

    
Piotr Dobrogost 11.07.2011, 22:39
quelle

3 Antworten

8

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

  • Python sucht 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.

    
Piotr Dobrogost 16.01.2013, 13:32
quelle
6

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.

    
anatoly techtonik 15.01.2013 19:30
quelle
3

IMO gibt es mehr Gründe dafür:

  • Sicherheit: In einigen Umgebungen verhindert die Richtlinie das Ausführen / Laden von Daten von beliebigen Speicherorten, um Sicherheitsverletzungen zu verhindern. Also,
  • Die etwas bekannte DLL //stackoverflow.com/questions/2382222/dll-loading-order">load order , das verhindert, dass bösartige DLLs geladen werden :). Siehe auch hier

HTH,

    
Laur Ivan 10.01.2013 14:14
quelle

Tags und Links