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

发布于 2024-10-15 18:04:02 字数 240 浏览 9 评论 0原文

virtualenv 不将 .py(w) 文件与 virtualenv 的 Python 可执行文件版本关联的原因是什么?考虑到没有像 shebang 在 Windows 上。

What is the reason virtualenv does not associate .py(w) files with virtualenv's version of Python executables? This seems like an ideal task for virtualenv on Windows taking into consideration that there's no mechanism like shebang on Windows.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

反话 2024-10-22 18:04:02

文件类型关联在 Windows 注册表中处理。 virtualenv 激活脚本必须修改注册表项,而停用脚本则需要恢复以前的值(否则可能会破坏关联)。

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

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

File type associations are handled in the Windows registry. The virtualenv activate script would have to modify the registry keys and the deactivate script would need to restore the previous value (or risk breaking the associations).

What happens if you activate a virtualenv, open a second instance of cmd.exe, and activate a different virtualenv? Unless you deactivate them in the right order, the stored values for the registry keys would be lost.

I'm not a virtualenv developer, I'd say that the potential problems far outweigh the slight benefit.

囍笑 2024-10-22 18:04:02

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

更新

现在这是可能的 - 请参阅如何将Python脚本与活动的virtualenv关联起来?

virtualenvwrapper-win does associate Python files with currently active virtualenv:

Note that the batch script pyassoc requires an elevated command prompt or that UAC is disabled. This script associates .py
files with python.bat, a simple batch file that calls the right
python.exe based on whether you have an active virtualenv. This
allows you to call python scripts from the command line and have the
right python interpreter invoked. Take a look at the source -- it's
incredibly simple but the best way I've found to handle conditional
association of a file extension.

python.bat looks like this

@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

Now it's possible – see How to associate Python scripts with active virtualenv?

韶华倾负 2024-10-22 18:04:02

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

我总是键入 python.py,而不是在提示符下键入 .py。如果你采用这个习惯,virtualenv 不会为你执行正确的 Python 吗?

All of my Python development at present is on Linux, but I'm looking at working on Windows, which is how I found this question. My answer would be an operational one:

Instead of typing <scriptName>.py at a prompt, I always type python <scriptName>.py. If you adopt this habit, won't virtualenv execute the proper Python for you?

南渊 2024-10-22 18:04:02

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

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

现在,您可以在 #!你的脚本行:

#!venvpython
import sys
print(sys.executable)

The Python launcher supports custom commands. Create a py.ini file in $env:LOCALAPPDATA with a section like this:

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

Now, you can use venvpython in the #! line of your script:

#!venvpython
import sys
print(sys.executable)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文