【问题标题】:Why doesn't virtualenv on Windows associate .py/.pyw/.pyo/.pyc files with virtualenv's version of Python executables?为什么 Windows 上的 virtualenv 不将 .py/.pyw/.pyo/.pyc 文件与 virtualenv 的 Python 可执行文件版本相关联?
【发布时间】:2011-06-20 06:14:50
【问题描述】:

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

【问题讨论】:

标签: python windows virtualenv file-association shebang


【解决方案1】:

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

请注意,批处理脚本pyassoc 需要提升的命令提示符或禁用 UAC。此脚本关联 .py 带有python.bat 的文件,一个简单的批处理文件,它调用正确的 python.exe 基于你是否有一个活动的 virtualenv。这 允许您从命令行调用 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

更新

现在有可能 - 请参阅 How to associate Python scripts with active virtualenv?

【讨论】:

    【解决方案2】:

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

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

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

    #!venvpython
    import sys
    print(sys.executable)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 如果你养成这个习惯,答案是肯定的,来自活动 virtualenv 的 Python 可执行文件将被执行,因为它是 PATH中的第一个 python.exe > 环境变量。
      【解决方案4】:

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

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

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

      【讨论】:

      • 简短的回答可能是“它既复杂又痛苦,没有人希望该功能足以实现它”。
      • FWIW, python.org/dev/peps/pep-0397 描述了使用“虚拟”python 启动器来检测适当的 python 版本。也许这样的实用程序可以包含适用于 virtualenv 的逻辑?
      • @Macke 在提出问题时该提案不存在,但 virtualenv 肯定可以修改为类似的工作
      • @Velociraptors 在我对Temporary file association for single cmd.exe session 问题的回答中,我展示了如何在命令行会话期间定义文件类型关联。 Virtualenv 可以使用它来实现我的要求。
      • virtualenv 激活脚本必须修改注册表项 实际上不需要。正如 virtualenvwrapper-win 所示,解决方案是将 Python 文件与一个批处理文件相关联,该批处理文件选择运行哪个 Python。
      猜你喜欢
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 2012-02-07
      • 2013-10-20
      • 1970-01-01
      相关资源
      最近更新 更多