2011-02-02 45 views
7

virtualenv沒有將.py(w)文件與virtualenv的Python可執行文件的版本關聯起來,原因是什麼?這對於Windows上的virtualenv來說似乎是一個理想的任務,考慮到Windows上沒有像shebang這樣的機制。爲什麼Windows上的virtualenv與virtualenv版本的Python可執行文件關聯.py/.pyw/.pyo/.pyc文件?

+4

見http://www.python.org/dev/peps/pep- 0397 /適用於Windows的shebang-proposal。 – Macke 2011-06-01 09:36:34

+1

非常相關:[單個cmd.exe會話臨時文件關聯](http://stackoverflow.com/questions/5583024/) – 2011-09-06 20:42:00

回答

4

文件類型關聯在Windows註冊表中處理。 virtualenv激活腳本將不得不修改註冊表項,並且停用腳本需要恢復以前的值(或者冒險破壞關聯)。

如果激活virtualenv,打開第二個cmd.exe實例並激活其他virtualenv,會發生什麼情況?除非您以正確的順序禁用它們,否則註冊表項的存儲值將會丟失。

我不是virtualenv的開發者,我想說潛在的問題遠遠超過了微小的好處。

+0

較短的答案可能是「這是複雜和痛苦的,沒有人希望該功能足以實現它」。 – Velociraptors 2011-02-03 22:22:31

1

我所有的Python開發目前都在Linux上,但我正在研究Windows,這是我如何找到這個問題。我的答案將是一個可操作的:

在提示時,我總是輸入python <scriptName>.py而不是輸入<scriptName>.py。如果你採用這種習慣,virtualenv會不會爲你執行正確的Python?

1

Python啓動器支持自定義命令。像這樣一款LOCALAPPDATA:創建$ ENV一個py.ini文件

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

現在,你可以在#使用venvpython!你的腳本行:

#!venvpython 
import sys 
print(sys.executable) 
2

virtualenvwrapper-win確實與當前活動的virtualenv副Python文件:

注意,批處理腳本pyassoc需要提升的命令提示符或UAC被禁用。此腳本將.py 文件與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

現在,可以 - 看How to associate Python scripts with active virtualenv?

相關問題