Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t Windows上的virtualenv将.py/.pyw/.pyo/.pyc文件与virtualenv';Python可执行文件的s版本?_Python_Windows_Virtualenv_File Association_Shebang - Fatal编程技术网

为什么';t Windows上的virtualenv将.py/.pyw/.pyo/.pyc文件与virtualenv';Python可执行文件的s版本?

为什么';t Windows上的virtualenv将.py/.pyw/.pyo/.pyc文件与virtualenv';Python可执行文件的s版本?,python,windows,virtualenv,file-association,shebang,Python,Windows,Virtualenv,File Association,Shebang,virtualenv不将.py(w)文件与virtualenv版本的Python可执行文件关联的原因是什么?考虑到Windows上没有类似的机制,这似乎是Windows上virtualenv的理想任务。文件类型关联在Windows注册表中处理。virtualenv activate脚本必须修改注册表项,而deactivate脚本需要恢复以前的值(或冒着破坏关联的风险) 如果激活一个virtualenv,打开cmd.exe的第二个实例,然后激活另一个virtualenv,会发生什么?除非按正确的顺

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

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

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


我不是一个virtualenv开发人员,我要说的是,潜在的问题远远大于微小的好处。

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


我没有在提示符下键入
.py
,而是总是键入
python.py
。如果您采用这种习惯,virtualenv是否会为您执行正确的Python?

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

[commands]
venvpython=C:\Path\To\Virtualenv\Scripts\python.exe
现在,您可以在#中使用Venpython!您的脚本行:

#!venvpython
import sys
print(sys.executable)
是否将Python文件与当前活动的virtualenv关联:

请注意,批处理脚本
pyassoc
需要提升的命令提示符,或者UAC已禁用。此脚本关联.py 包含
python.bat
的文件,这是一个调用
python.exe
取决于您是否有活动的virtualenv。这 允许您从命令行调用python脚本,并具有 调用了正确的python解释器。看一看来源——它是 非常简单,但这是我发现的处理条件反射的最好方法 文件扩展名的关联

看起来像这样

@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
更新


现在这是可能的–请参见

简短的回答可能是“这很复杂和痛苦,没有人想要足够的功能来实现它”。FWIW描述了如何使用“虚拟”python启动器来检测适当的python版本。也许这样一个实用程序可以包含适用于virtualenv的逻辑?@Macke当被问到这个问题时,这个建议并不存在,但virtualenv也有可能通过类似的方式进行修改that@Velociraptors在对问题的回答中,我展示了如何在命令行会话期间定义文件类型关联。Virtualenv可以用它来实现我的要求。Virtualenv激活脚本必须修改注册表项,实际上不是这样。正如virtualenvwrapper win所示,解决方案是将Python文件与选择运行哪种Python的批处理文件相关联。请参阅针对Windows的shebang建议。非常相关:如果您采用这种习惯,答案是肯定的,那么来自活动virtualenv的Python可执行文件将被执行,因为它是PATH环境变量中的第一个Python.exe。