![](/img/trans.png)
[英]Virtualenv with different python version doesn't work on windows
[英]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.