7

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

4

4 回答 4

4

文件类型关联在 Windows 注册表中处理。virtualenv activate 脚本必须修改注册表项,而 deactivate 脚本需要恢复以前的值(或有破坏关联的风险)。

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

我不是 virtualenv 开发人员,我会说潜在的问题远远超过了轻微的好处。

于 2011-02-02T22:28:16.113 回答
2

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

请注意,批处理脚本pyassoc需要提升的命令提示符或禁用 UAC。此脚本将 .py 文件与一个简单的批处理文件相关联,该批处理文件根据您是否有活动的 virtualenvpython.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 脚本与活动的 virtualenv 关联?

于 2012-10-28T13:22:18.313 回答
1

目前我所有的 Python 开发都是在 Linux 上进行的,但我正在考虑在 Windows 上工作,这就是我发现这个问题的方式。我的答案将是一个可操作的:

我不是在提示符下输入,而是<scriptName>.py总是输入python <scriptName>.py. 如果你养成这个习惯,virtualenv 不会为你执行正确的 Python 吗?

于 2011-02-15T20:56:26.700 回答
1

Python 启动器支持自定义命令。在 $env:LOCALAPPDATA 中创建一个 py.ini 文件,其中包含如下部分:

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

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

#!venvpython
import sys
print(sys.executable)
于 2012-10-03T22:13:55.717 回答