2011-02-02 10 views
7

¿Cuál es la razón por la cual virtualenv no asocia los archivos .py(w) con la versión de Virtualenv de los ejecutables de Python? Esto parece una tarea ideal para virtualenv en Windows teniendo en cuenta que no existe un mecanismo como shebang en Windows.¿Por qué Virtualenv en Windows no asocia archivos .py/.pyw/.pyo/.pyc con la versión de virtualenv de los ejecutables de Python?

+4

Ver http://www.python.org/dev/peps/pep- 0397/para shebang-propuesta para Windows. – Macke

+1

Muy relacionado: [Asociación temporal de archivos para una única sesión cmd.exe] (http://stackoverflow.com/questions/5583024/) –

Respuesta

4

Las asociaciones de tipo de archivo se manejan en el registro de Windows. El script virtualenv activate tendría que modificar las claves de registro y el script desactivado tendría que restaurar el valor anterior (o arriesgarse a romper las asociaciones).

¿Qué sucede si activa un virtualenv, abre una segunda instancia de cmd.exe y activa un virtualenv diferente? A menos que los desactive en el orden correcto, los valores almacenados para las claves de registro se perderán.

No soy un desarrollador virtualenv, diría que los problemas potenciales superan con creces el pequeño beneficio.

+0

La respuesta más breve es, probablemente, "es complicado y doloroso y nadie quiere esa característica lo suficiente para implementarlo ". – Velociraptors

+1

FWIW, http: //www.python.org/dev/peps/pep-0397/describe el uso de un iniciador python 'virtual' que detectaría la versión apropiada de python. Tal vez tal utilidad podría hacerse para incluir lógica adecuada para virtualenv? – Macke

+0

@Macke esa propuesta no existía cuando se formuló la pregunta, pero ciertamente es posible virtualenv podría modificarse el trabajo con algo así como – Velociraptors

1

Todo mi desarrollo de Python actualmente está en Linux, pero estoy buscando trabajar en Windows, que es la forma en que encontré esta pregunta. Mi respuesta sería operativa:

en un mensaje, siempre escribo python <scriptName>.py. Si adoptas este hábito, ¿no ejecutarás Virtualenv el Python adecuado para ti?

+0

Si adopta este hábito, la respuesta es sí, el ejecutable de Python del virtualenv activo se ejecutará ya que es el primer * python.exe * en la variable de entorno * PATH *. –

1

El lanzador de Python admite comandos personalizados. Crear un archivo py.ini en $ env: LOCALAPPDATA con una sección como esta:

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

Ahora, puede utilizar venvpython en el #! línea del script:

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

virtualenvwrapper-win hace Python archivos asociados con virtualenv actualmente activo:

Tenga en cuenta que la secuencia de comandos por lotes pyassoc requiere un símbolo elevado o que UAC está desactivado. Esta secuencia de comandos asocia archivos .py con python.bat, un archivo de proceso por lotes simple que llama a la derecha python.exe en función de si tiene una función virtual activa. Este le permite llamar a los scripts de Python desde la línea de comandos y tener invocado el intérprete de python derecho . Eche un vistazo a la fuente - es increíblemente simple, pero la mejor manera que he encontrado para manejar la asociación condicional de una extensión de archivo.

python.bat se parece a esto

@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 

ACTUALIZACIÓN

Ahora es posible - ver How to associate Python scripts with active virtualenv?

Cuestiones relacionadas