web-dev-qa-db-ja.com

Windowsの「ソース」に相当するバッチ:virtualenvからPythonスクリプトを実行する方法

私はかなりのbashスクリプトを作成しましたが、Windowsではバッチスクリプトをほとんど実行していません。 Python virtualenvをアクティブにしようとしていますPythonスクリプトを実行し、スクリプトが終了したらvirtualenvを非アクティブにします。

私のvirtualenvであるenvというフォルダーと、スクリプトが含まれているworkというフォルダーがあります。

これは私がこれまでに得たものです:

%~dp0env\Scripts\activate.bat
python %~dp0work\script.py
deactivate

しかし、スクリプトを実行すると、virtualenvがアクティブになり、停止します。これは2行目に到達せず、Pythonスクリプトを実行します。アクティブ化スクリプトフォルダーを「ソース」して、残りのバッチスクリプトを、が呼び出されましたactivate.batコマンドラインから?

40
jmite

Activate.batの呼び出しに「call」を付加するだけで、activateの実行後に現在のバッチファイルが確実に再開されるようにできます。

call %~dp0env\Scripts\activate.bat

deactivate.batについても同じことを検討してください。さらに、現在のcmd.exe環境がバッチファイルの呼び出しによって汚染されないようにする場合は、コマンドをsetlocal/endlocalコマンドペアでラップすることを検討してください。

59
Nicola Musatti

私はcmd /k "path/to the/script/activate.bat"を指す.lnkファイルを作成しました。

CMDパラメータとオプション

6
Maho

Linux Bash/Shellで期待されているのと同じように、Windowsでも同じコマンドを実行したいと思います。 virtualenvを起動したいときは、実際にはその最上位ディレクトリにいるので、Linuxコマンドは「source bin/activate」になります。

Windowsでこの動作をシミュレートしても問題ありません。私個人的には、activate.batという名前のバッチファイルを、次のようにPATH環境変数のどこかに配置しました。

:: activate.bat
@echo off
REM source bin/activate
if "%1" == "bin/activate" (
    if not EXIST "%CD%\Scripts\activate.bat" goto notfound
    set WRAPEX=Scripts\activate.bat
) ELSE (
       set WRAPEX=%*
)
call %WRAPEX%
goto :eof

:notfound
echo Cannot find the activate script -- aborting.
goto :eof
2
newby2000