簡體   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