2011-02-02 14 views
7

Qual è la ragione per cui virtualenv non associa i file .py(w) con la versione di eseguibili Python di virtualenv? Questo sembra un compito ideale per virtualenv su Windows, tenendo conto del fatto che non esiste un meccanismo come shebang su Windows.Perché virtualenv su Windows associa file .py/.pyw/.pyo/.pyc con la versione di virtualenv degli eseguibili Python?

+4

Vedi http://www.python.org/dev/peps/pep- 0397/per shebang-proposta per Windows. – Macke

+1

Molto correlato: [associazione di file temporanei per singola sessione di cmd.exe] (http://stackoverflow.com/questions/5583024/) –

risposta

4

associazioni di tipo file vengono gestiti nel registro di Windows. Lo script activate di virtualenv dovrebbe modificare le chiavi di registro e lo script di disattivazione dovrebbe ripristinare il valore precedente (o rischiare di rompere le associazioni).

Che cosa succede se si attiva una virtualenv, aprire una seconda istanza di cmd.exe, e attivare un virtualenv diverso? A meno che non vengano disattivati ​​nell'ordine corretto, i valori memorizzati per le chiavi del Registro di sistema andrebbero persi.

Io non sono uno sviluppatore virtualenv, direi che i potenziali problemi superano di gran lunga il leggero vantaggio.

+0

La risposta più breve è probabilmente "è complicato e doloroso e nessuno vuole basta che caratteristica per la sua attuazione ". – Velociraptors

+1

FWIW, http: //www.python.org/dev/peps/pep-0397/descrive l'utilizzo di un python launcher 'virtuale' che rileva la versione python appropriata. Forse una tale utilità potrebbe essere fatta per includere la logica adatta per virtualenv? – Macke

+0

@Macke che la proposta non esisteva quando è stata posta la domanda, ma è certamente possibile che virtualenv possa essere modificato con qualcosa del genere – Velociraptors

1

Tutta la mia sviluppo Python attualmente è su Linux, ma io sto guardando a lavorare su Windows, che è come ho trovato questa domanda. La mia risposta sarebbe operativa:

Invece di digitare <scriptName>.py al prompt, digito sempre python <scriptName>.py. Se si adotta questa abitudine, virtualenv non eseguirà il giusto Python per te?

+0

Se si adotta questa abitudine, la risposta è sì, l'eseguibile di Python da virtualenv attivo verrà eseguito poiché è il primo * python.exe * nella variabile d'ambiente * PATH *. –

1

Il Python lanciatore supporta i comandi personalizzati. Creare un file py.ini in $ ENV: LOCALAPPDATA con una sezione come questa:

[commands] 
venvpython=C:\Path\To\Virtualenv\Scripts\python.exe 

Ora, è possibile utilizzare venvpython nel #! la linea dello script:

#!venvpython 
import sys 
print(sys.executable) 
2

virtualenvwrapper-win fa file Python associare con virtualenv attualmente attiva:

Nota che lo script batch di pyassoc richiede un prompt dei comandi con privilegi elevati o che UAC è disabilitato. Questo script associa .py file con python.bat, un semplice file batch che chiama il diritto python.exe a seconda se si dispone di un virtualenv attiva. Questo consente di chiamare gli script python dalla riga di comando e di invocare l'interprete python destro . Dai un'occhiata alla fonte: è incredibilmente semplice, ma il modo migliore che ho trovato per gestire l'associazione condizionale di un'estensione di file.

python.bat assomiglia a questo

@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

Ora è possibile - vedi How to associate Python scripts with active virtualenv?