为什么';t Windows上的virtualenv将.py/.pyw/.pyo/.pyc文件与virtualenv';Python可执行文件的s版本?
virtualenv不将为什么';t Windows上的virtualenv将.py/.pyw/.pyo/.pyc文件与virtualenv';Python可执行文件的s版本?,python,windows,virtualenv,file-association,shebang,Python,Windows,Virtualenv,File Association,Shebang,virtualenv不将.py(w)文件与virtualenv版本的Python可执行文件关联的原因是什么?考虑到Windows上没有类似的机制,这似乎是Windows上virtualenv的理想任务。文件类型关联在Windows注册表中处理。virtualenv activate脚本必须修改注册表项,而deactivate脚本需要恢复以前的值(或冒着破坏关联的风险) 如果激活一个virtualenv,打开cmd.exe的第二个实例,然后激活另一个virtualenv,会发生什么?除非按正确的顺
.py(w)
文件与virtualenv版本的Python可执行文件关联的原因是什么?考虑到Windows上没有类似的机制,这似乎是Windows上virtualenv的理想任务。文件类型关联在Windows注册表中处理。virtualenv activate脚本必须修改注册表项,而deactivate脚本需要恢复以前的值(或冒着破坏关联的风险)
如果激活一个virtualenv,打开cmd.exe的第二个实例,然后激活另一个virtualenv,会发生什么?除非按正确的顺序停用它们,否则注册表项的存储值将丢失
我不是一个virtualenv开发人员,我要说的是,潜在的问题远远大于微小的好处。目前我所有的Python开发都是在Linux上进行的,但我正在考虑在Windows上工作,这就是我发现这个问题的原因。我的答案是可行的:
我没有在提示符下键入
.py
,而是总是键入python.py
。如果您采用这种习惯,virtualenv是否会为您执行正确的Python?Python启动器支持自定义命令。在$env:LOCALAPPDATA中创建一个py.ini文件,其部分如下:
[commands]
venvpython=C:\Path\To\Virtualenv\Scripts\python.exe
现在,您可以在#中使用Venpython!您的脚本行:
#!venvpython
import sys
print(sys.executable)
是否将Python文件与当前活动的virtualenv关联:
请注意,批处理脚本pyassoc
需要提升的命令提示符,或者UAC已禁用。此脚本关联.py
包含python.bat
的文件,这是一个调用
python.exe
取决于您是否有活动的virtualenv。这
允许您从命令行调用python脚本,并具有
调用了正确的python解释器。看一看来源——它是
非常简单,但这是我发现的处理条件反射的最好方法
文件扩展名的关联
看起来像这样
@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
更新
现在这是可能的–请参见简短的回答可能是“这很复杂和痛苦,没有人想要足够的功能来实现它”。FWIW描述了如何使用“虚拟”python启动器来检测适当的python版本。也许这样一个实用程序可以包含适用于virtualenv的逻辑?@Macke当被问到这个问题时,这个建议并不存在,但virtualenv也有可能通过类似的方式进行修改that@Velociraptors在对问题的回答中,我展示了如何在命令行会话期间定义文件类型关联。Virtualenv可以用它来实现我的要求。Virtualenv激活脚本必须修改注册表项,实际上不是这样。正如virtualenvwrapper win所示,解决方案是将Python文件与选择运行哪种Python的批处理文件相关联。请参阅针对Windows的shebang建议。非常相关:如果您采用这种习惯,答案是肯定的,那么来自活动virtualenv的Python可执行文件将被执行,因为它是PATH环境变量中的第一个Python.exe。