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

7 投票
4 回答
1451 浏览
提问于 2025-04-16 11:06

为什么virtualenv不把.py(w)文件和它自己版本的Python执行程序关联起来呢?考虑到Windows上没有像shebang这样的机制,这似乎是virtualenv在Windows上一个很理想的任务。

4 个回答

1

我现在所有的Python开发都是在Linux上进行的,但我想在Windows上工作,所以我找到了这个问题。我的回答是从操作的角度来说:

我总是输入 python <scriptName>.py,而不是直接输入 <scriptName>.py。如果你养成这个习惯,虚拟环境不就会为你执行正确的Python版本吗?

2

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 脚本与活动的虚拟环境关联?

4

文件类型的关联是在Windows注册表中管理的。要让虚拟环境的激活脚本修改注册表的内容,而在停用脚本时又需要把之前的值恢复回来,否则可能会破坏这些关联。

如果你激活了一个虚拟环境,然后再打开一个cmd.exe的窗口,激活另一个虚拟环境,会发生什么呢?如果你不按照正确的顺序停用它们,注册表中的存储值就会丢失。

我不是虚拟环境的开发者,但我觉得可能出现的问题远远超过了它带来的小好处。

撰写回答