2011-02-02 19 views
7

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?

+4

Zobacz http://www.python.org/dev/peps/pep- 0397/for shebang-proposal dla systemu Windows. – Macke

+1

Bardzo podobne: [Tymczasowe skojarzenie plików dla pojedynczej sesji cmd.exe] (http://stackoverflow.com/questions/5583024/) –

Odpowiedz

4

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ść.

+0

Krótsza odpowiedź to prawdopodobnie "jest skomplikowana i bolesna i nikt nie chce tej funkcji na tyle, aby ją wdrożyć" ". – Velociraptors

+1

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

+0

@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

1

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?

+0

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 *. –

1

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) 
2

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 z python.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?