为什么Windows上的virtualenv不将.py/.pyw/.pyo/.pyc文件与virtualenv的Python可执行文件关联?
为什么virtualenv不把.py(w)
文件和它自己版本的Python执行程序关联起来呢?考虑到Windows上没有像shebang这样的机制,这似乎是virtualenv在Windows上一个很理想的任务。
4 个回答
我现在所有的Python开发都是在Linux上进行的,但我想在Windows上工作,所以我找到了这个问题。我的回答是从操作的角度来说:
我总是输入 python <scriptName>.py
,而不是直接输入 <scriptName>.py
。如果你养成这个习惯,虚拟环境不就会为你执行正确的Python版本吗?
virtualenvwrapper-win 可以把 Python 文件和当前正在使用的虚拟环境关联起来:
需要注意的是,批处理脚本
pyassoc
需要在提升权限的命令提示符下运行,或者需要关闭用户账户控制(UAC)。这个脚本会把 .py 文件和python.bat
关联起来,python.bat
是一个简单的批处理文件,它会根据你是否有激活的虚拟环境来调用正确的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
更新
现在可以做到这一点——请查看 如何将 Python 脚本与活动的虚拟环境关联?
文件类型的关联是在Windows注册表中管理的。要让虚拟环境的激活脚本修改注册表的内容,而在停用脚本时又需要把之前的值恢复回来,否则可能会破坏这些关联。
如果你激活了一个虚拟环境,然后再打开一个cmd.exe的窗口,激活另一个虚拟环境,会发生什么呢?如果你不按照正确的顺序停用它们,注册表中的存储值就会丢失。
我不是虚拟环境的开发者,但我觉得可能出现的问题远远超过了它带来的小好处。