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

virtualenv没有将.py(w)文件与virtualenv的Python可执行文件版本关联起来,这是什么原因? 这对于Windows上的virtualenv来说似乎是一个理想的任务,考虑到在Windows上没有像shebang这样的机制。

Solutions Collecting From Web of "为什么Windows上的virtualenv与virtualenv版本的Python可执行文件关联.py / .pyw / .pyo / .pyc文件?"

文件类型关联在Windows注册表中处理。 virtualenv激活脚本将不得不修改注册表项,停用脚本将需要恢复以前的值(或冒险打破关联)。

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

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

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

请注意,批处理脚本pyassoc需要提升的命令提示符或UAC被禁用。 这个脚本将.py文件与python.bat关联起来, python.bat是一个简单的批处理文件,根据是否有活动的virtualenv来调用正确的python.exe 。 这使您可以从命令行调用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 

UPDATE

现在有可能 – 请参阅如何将Python脚本与活动的virtualenv相关联?

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

在提示符处输入<scriptName>.py ,而不是输入python <scriptName>.py 。 如果你采用这个习惯,那么virtualenv会不会为你执行正确的Python?

Python启动器支持自定义命令。 在$ env:LOCALAPPDATA中创建一个py.ini文件。

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

现在,你可以在#中使用venvpython了! 你的脚本的行:

 #!venvpython import sys print(sys.executable)