Jaki jest powód virtualenv nie kojarzy plików .py(w)
z wersjami plików Python virtualenv? Wydaje się to idealnym zadaniem dla virtualenv w systemie Windows, biorąc pod uwagę, że nie ma takiego mechanizmu, jak shebang w systemie Windows.Dlaczego virtualenv w systemie Windows nie kojarzy plików .py/.pyw/.pyo/.pyc z wersją plików wykonywalnych Python virtualenv?
Odpowiedz
Powiązania typów plików są obsługiwane w rejestrze systemu Windows. Aktywowany skrypt virtualenv musiałby zmodyfikować klucze rejestru, a skrypt dezaktywacji musiałby przywrócić poprzednią wartość (lub ryzyko zerwania powiązań).
Co stanie się, gdy aktywujesz virtualenv, otwórz drugą instancję cmd.exe i aktywuj inny virtualenv? O ile nie dezaktywujesz ich we właściwej kolejności, zapisane wartości kluczy rejestru zostaną utracone.
Nie jestem programistą virtualenv, powiedziałbym, że potencjalne problemy znacznie przewyższają niewielką korzyść.
Krótsza odpowiedź to prawdopodobnie "jest skomplikowana i bolesna i nikt nie chce tej funkcji na tyle, aby ją wdrożyć" ". – Velociraptors
FWIW, http: //www.python.org/dev/peps/pep-0397/opisuje za pomocą "wirtualnego" launchera pythonów, który wykryłby odpowiednią wersję pythona. Być może takie narzędzie może zawierać logikę odpowiednią dla virtualenv? – Macke
@Macke tej propozycji nie istniało, gdy pytanie zostało zadane, ale z pewnością możliwe, że virtualenv można zmodyfikować pracę z czymś takim, jak – Velociraptors
Cały mój rozwój Pythona jest obecnie w Linuksie, ale ja patrzę na pracę w systemie Windows, i tak znalazłem to pytanie. Moja odpowiedź byłaby operacyjna:
Zamiast wpisywać po znaku <scriptName>.py
, zawsze wpisuję python <scriptName>.py
. Jeśli przyzwyczaisz się do tego nawyku, czy virtualenv nie uruchomi dla ciebie właściwego Pythona?
Jeśli przyjmiesz ten nawyk, odpowiedź brzmi: tak, plik wykonywalny Pythona z aktywnego virtualenv zostanie wykonany, ponieważ jest pierwszym * python.exe * w zmiennej środowiskowej * PATH *. –
Program uruchamiający Python obsługuje niestandardowe polecenia. Utwórz plik py.ini w $ env: LocalAppData o przekroju tak:
[commands]
venvpython=C:\Path\To\Virtualenv\Scripts\python.exe
Teraz można użyć venvpython w #! linia skryptu:
#!venvpython
import sys
print(sys.executable)
virtualenvwrapper-win robi kojarzenia plików Pythona z aktualnie aktywnego virtualenv:
Zauważ, że skrypt wsadowy
pyassoc
wymaga wiersza polecenia lub że UAC jest wyłączone. Ten skrypt kojarzy pliki .py zpython.bat
, prostym plikiem wsadowym, który nazywa siępython.exe
w zależności od tego, czy masz aktywne virtualenv. Ten numer umożliwia wywoływanie skryptów Pythona z wiersza poleceń i wywołanie odpowiedniego interpretera Pythona . Spójrz na źródło - to jest bardzo proste, ale najlepszym sposobem na radzenie sobie z uwarunkowaniem związanym z rozszerzeniem pliku jest .
python.bat
wygląda to
@echo off
if defined PYTHONHOME (
goto MAIN
)
FOR /F "tokens=*" %%i in ('whereis.bat python.exe') do set PYTHONHOME=%%~dpi
SET PYTHONHOME=%PYTHONHOME:~0,-1%
:MAIN
SETLOCAL EnableDelayedExpansion
if defined VIRTUAL_ENV (
set PY="%VIRTUAL_ENV%\Scripts\python.exe"
) else (
set PY="%PYTHONHOME%\python.exe"
)
ENDLOCAL & %PY% %*
:END
UPDATE
Teraz jest to możliwe - patrz How to associate Python scripts with active virtualenv?
Zobacz http://www.python.org/dev/peps/pep- 0397/for shebang-proposal dla systemu Windows. – Macke
Bardzo podobne: [Tymczasowe skojarzenie plików dla pojedynczej sesji cmd.exe] (http://stackoverflow.com/questions/5583024/) –