为什么Windows上的virtualenv不会将.py / .pyw / .pyo / .pyc文件与virtualenv的Python可执行文件版本相关联?

时间:2011-02-02 20:42:45

标签: python windows virtualenv file-association shebang

virtualenv不将.py(w)文件与virtualenv版本的Python可执行文件相关联的原因是什么?考虑到Windows上没有类似shebang的机制,这似乎是Windows上virtualenv的理想任务。

4 个答案:

答案 0 :(得分:4)

文件类型关联在Windows注册表中处理。 virtualenv激活脚本必须修改注册表项,并且去激活脚本需要恢复以前的值(或破坏关联的风险)。

如果激活virtualenv,打开cmd.exe的第二个实例并激活其他virtualenv会发生什么?除非您按正确的顺序停用它们,否则注册表项的存储值将丢失。

我不是一个虚拟的开发者,我会说潜在的问题远远超过了微不足道的好处。

答案 1 :(得分:2)

virtualenvwrapper-win确实将Python文件与当前活动的virtualenv相关联:

  

请注意,批处理脚本pyassoc需要提升的命令提示符或禁用UAC。此脚本关联.py   python.bat的文件,一个调用右边的简单批处理文件   python.exe基于您是否拥有活跃的virtualenv。这个   允许您从命令行调用python脚本并拥有   调用了正确的python解释器。看看来源 - 它是   非常简单,但我发现处理条件的最佳方式   文件扩展名的关联。

python.bat看起来像这样

@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

<强>更新

现在可以 - 请参阅How to associate Python scripts with active virtualenv?

答案 2 :(得分:1)

目前我所有的Python开发都在Linux上,但我正在研究Windows,这就是我发现这个问题的方法。我的答案是可操作的:

我总是输入<scriptName>.py,而不是在提示符下输入python <scriptName>.py。如果你采用这种习惯,virtualenv不会为你执行适当的Python吗?

答案 3 :(得分:1)

Python启动程序支持自定义命令。在$ env:LOCALAPPDATA中创建一个py.ini文件,其中包含以下部分:

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

现在,您可以在#中使用venvpython!你的剧本一行:

#!venvpython
import sys
print(sys.executable)