virtualenv不将.py(w)
文件与virtualenv版本的Python可执行文件相关联的原因是什么?考虑到Windows上没有类似shebang的机制,这似乎是Windows上virtualenv的理想任务。
答案 0 :(得分:4)
文件类型关联在Windows注册表中处理。 virtualenv激活脚本必须修改注册表项,并且去激活脚本需要恢复以前的值(或破坏关联的风险)。
如果激活virtualenv,打开cmd.exe的第二个实例并激活其他virtualenv会发生什么?除非您按正确的顺序停用它们,否则注册表项的存储值将丢失。
我不是一个虚拟的开发者,我会说潜在的问题远远超过了微不足道的好处。
答案 1 :(得分:2)
virtualenvwrapper-win确实将Python文件与当前活动的virtualenv相关联:
请注意,批处理脚本
pyassoc
需要提升的命令提示符或禁用UAC。此脚本关联.pypython.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)