繁体   English   中英

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

[英]Why doesn't virtualenv on Windows associate .py/.pyw/.pyo/.pyc files with virtualenv's version of Python executables?

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

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

如果激活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启动程序支持自定义命令。 在$ env:LOCALAPPDATA中创建一个py.ini文件,其中包含以下部分:

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

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

#!venvpython
import sys
print(sys.executable)

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

而不是输入的<scriptName>.py在一个提示,我总是键入python <scriptName>.py 如果你采用这种习惯,virtualenv不会为你执行适当的Python吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM