bash では、次のことができます。
python - << EOF
import os
print 'hello'
EOF
python コード スニペットを bash スクリプトに埋め込む。
しかし、Windows バッチでは、これは機能しません。まだ python -c を使用できますが、コードを 1 行にまとめる必要があり、これは回避しようとしています。
バッチスクリプトでこれを達成する方法はありますか?
ありがとう。
bash では、次のことができます。
python - << EOF
import os
print 'hello'
EOF
python コード スニペットを bash スクリプトに埋め込む。
しかし、Windows バッチでは、これは機能しません。まだ python -c を使用できますが、コードを 1 行にまとめる必要があり、これは回避しようとしています。
バッチスクリプトでこれを達成する方法はありますか?
ありがとう。
さらに効率的で、すべてのコマンドライン引数をスクリプトに渡し、スクリプトから終了コードを返します。
@SETLOCAL ENABLEDELAYEDEXPANSION & python -x "%~f0" %* & EXIT /B !ERRORLEVEL!
# Your python code goes here...
何が起こっているかの内訳は次のとおりです。
@
スクリプト行が印刷されないようにしますSETLOCAL ENABLEDELAYEDEXPANSION
!ERRORLEVEL! を許可します。Pythonスクリプトの実行後に評価される&
別のコマンドを同じ行で実行できます (UNIX の と同様;
) 。python
Python インタープリターを実行します (%PATH% にある必要があります)-x
最初の行を無視するように python に指示します (詳細については python -h を実行してください)。"%~f0"
現在実行中のバッチ スクリプトの完全修飾パスに展開されます (引数 %0)。パスにスペースが含まれている場合は引用符で囲みます%*
スクリプトに渡されたすべての引数を展開し、効果的にそれらを python スクリプトに渡しますEXIT /B
現在のバッチ ファイルのみを終了するように Windows Batch に指示します (justEXIT
を使用すると、呼び出し元のインタープリターが終了します)。!ERRORLEVEL!
実行後、前のコマンドからの戻りコードに展開されます。への引数として使用するとEXIT /B
、Python インタープリターから受け取ったリターン コードでバッチ スクリプトが終了します。注: Python バイナリが PATH にない場合、または非標準の場所にある場合は、「python」を別のものに変更する必要がある場合があります。例えば:
@"C:\Path\To\Python.exe" -x ...
これを行う唯一の方法は、次のようにバッチ ファイルから Python スクリプトを呼び出すことです。
@echo off
REM whatever other code
python python_script.py
REM rest of batch file...
@echo off
setlocal EnableDelayedExpansion
set "fTmpPy=%TEMP%\~fTmp.py"
call :getLine "::python_beg" "::python_end" > "!fTmpPy!"
python "!fTmpPy!"
pause
exit /b 0
:getLine <beg str> <end str>
set "bBegEnd=0"
for /f "usebackq delims=" %%l in ("%~f0") do (
if !bBegEnd! equ 1 (
if "%%l" equ "%~2" ( exit /b 0 )
setlocal DisableDelayedExpansion
echo %%l
endlocal
) else (
if "%%l" equ "%~1" ( set "bBegEnd=1" )
)
)
exit /b 0
endlocal
::mark is unique - one character or string
::begin mark must be
::end mark is optional if it is on eof
::python_beg
print( 'Hello, world!' )
::python_end
任意の文字または文字列を含めることができますが、「!」のみを含めることができます。感嘆符は例外的です。「!」変数に使用されるため、「DisableDelayedExpansion」を設定する必要があります。最後に、'endlocal' を設定する必要があります。それで全部です。
このルーチンは、任意のスクリプトまたはドキュメントに使用できます。cmdスクリプトですが...