10

bash では、次のことができます。

python - << EOF
import os
print 'hello'
EOF

python コード スニペットを bash スクリプトに埋め込む。

しかし、Windows バッチでは、これは機能しません。まだ python -c を使用できますが、コードを 1 行にまとめる必要があり、これは回避しようとしています。

バッチスクリプトでこれを達成する方法はありますか?

ありがとう。

4

6 に答える 6

17

さらに効率的で、すべてのコマンドライン引数をスクリプトに渡し、スクリプトから終了コードを返します。

@SETLOCAL ENABLEDELAYEDEXPANSION & python -x "%~f0" %* & EXIT /B !ERRORLEVEL!
# Your python code goes here...

何が起こっているかの内訳は次のとおりです。

  • @スクリプト行が印刷されないようにします
  • SETLOCAL ENABLEDELAYEDEXPANSION!ERRORLEVEL! を許可します。Pythonスクリプトの実行に評価される
  • &別のコマンドを同じ行で実行できます (UNIX の と同様;) 。
  • pythonPython インタープリターを実行します (%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 ...
于 2015-04-26T17:44:27.640 に答える
0

これを行う唯一の方法は、次のようにバッチ ファイルから Python スクリプトを呼び出すことです。

@echo off
REM whatever other code
python python_script.py
REM rest of batch file...
于 2013-07-04T10:32:57.673 に答える
0
@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スクリプトですが...

于 2016-10-02T09:24:25.523 に答える