.py(w)
virtualenv がファイルを virtualenv のバージョンの Python 実行可能ファイルに関連付けない理由は何ですか? Windows にはshebangのようなメカニズムがないことを考慮すると、これは Windows 上の virtualenv にとって理想的なタスクのように思えます。
4 に答える
ファイル タイプの関連付けは、Windows レジストリで処理されます。virtualenv activate スクリプトはレジストリ キーを変更する必要があり、deactivate スクリプトは以前の値を復元する必要があります (または、関連付けが壊れるリスクがあります)。
virtualenv をアクティブ化し、cmd.exe の 2 番目のインスタンスを開き、別の virtualenv をアクティブ化するとどうなりますか? 正しい順序で無効にしないと、レジストリ キーに保存されている値が失われます。
私は virtualenv の開発者ではありません。潜在的な問題はわずかな利点よりもはるかに重要だと思います。
virtualenvwrapper-winは Python ファイルを現在アクティブな virtualenv に関連付けます:
バッチ スクリプト
pyassoc
には管理者特権のコマンド プロンプトが必要であるか、UAC が無効になっていることに注意してください。このスクリプトは、アクティブな virtualenv があるかどうかに基づいて権限をpython.bat
呼び出す単純なバッチ ファイルである .py ファイルを .py ファイルに関連付けます。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
アップデート
これで可能になりました – 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 を実行しませんか?