如何在批处理脚本中embeddedpython代码

bash中,我们可以:

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

在python脚本中embeddedpython代码片段。

但在Windows批处理中,这是行不通的 – 虽然我仍然可以使用python -c,但这需要我将我的代码组合到一行中,这是我试图避免的。

有没有办法在批处理脚本中实现这一点?

谢谢。

你可以使用混合技术。

 1>2# : ^ ''' @echo off echo normal echo batch code echo Switch to python python "%~f0" exit /b rem ^ ''' print "This is Python code" 

批处理代码是一个多行字符串'''所以这是python不可见的。
批解析器没有看到之前退出的python代码。

第一行是关键。
这对批处理也是有效的!
在Python中,这只是一个没有输出的无意义的比较1>2 ,其余的行是#的评论。

对于批次1>2#是将流1重定向到文件2#
命令是冒号:这表示一个标签,标签行从不打印。
然后,最后一个插入符将下一行添加到标签行,所以批次不会看到'''行。

效率更高,并且将所有命令行参数传递给脚本并返回脚本的退出代码:

 @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仅从当前批处理文件EXIT (仅使用EXIT将导致调用解释器退出)
  • !ERRORLEVEL! 在运行之后,扩展为上一个命令的返回代码。 用作EXIT /B的参数,它会导致批处理脚本退出,并返回从python解释器收到的代码

注意:如果你的Python二进制文件不在PATH中,或者处于非标准位置,你可能必须把“python”改成别的东西。 例如:

 @"C:\Path\To\Python.exe" -x ... 

解开你自己的想法,你必须立即在批处理文件中指定python脚本。 将python代码放在​​一个单独的文件中,然后从Windows批处理文件启动python下的单独文件。

我知道这样做的唯一方法是从批处理文件中调用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脚本…