如何在批处理脚本中嵌入python代码

Bai*_*ang 7 python windows bash batch-file

在bash中,我们可以:

python - << EOF
import os
print 'hello'
EOF
Run Code Online (Sandbox Code Playgroud)

在bash脚本中嵌入python代码片段.

但是在Windows批处理中,这不起作用 - 尽管我仍然可以使用python -c,但这需要我将我的代码拼写成一行,这是我试图避免的.

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

谢谢.

apr*_*nce 16

更高效,加上它将所有命令行参数传递给脚本并从脚本返回退出代码:

@SETLOCAL ENABLEDELAYEDEXPANSION & python -x "%~f0" %* & EXIT /B !ERRORLEVEL!
# Your python code goes here...
Run Code Online (Sandbox Code Playgroud)

这是对正在发生的事情的分解:

  • @ 防止打印脚本行
  • SETLOCAL ENABLEDELAYEDEXPANSION允许!ERRORLEVEL!在python脚本运行进行评估
  • &允许另一个命令在同一行上运行(类似于UNIX ;)
  • python 运行python解释器(必须在%PATH%)
  • -x 告诉python忽略第一行(运行python -h获取详细信息)
  • "%~f0"扩展到当前正在执行的批处理脚本的完全限定路径(参数%0).如果路径包含空格,则引用它
  • %* 扩展传递给脚本的所有参数,有效地将它们传递给python脚本
  • EXIT /B告诉Windows Batch仅退出当前批处理文件(使用just EXIT会导致调用解释器退出)
  • !ERRORLEVEL!运行后,将扩展为上一个命令的返回码.用作参数EXIT /B,它会导致批处理脚本退出,并从python解释器接收返回代码

注意:如果您的python二进制文件不在PATH中或位于非标准位置,您可能必须将"python"更改为其他内容.例如:

@"C:\Path\To\Python.exe" -x ...
Run Code Online (Sandbox Code Playgroud)


jeb*_*jeb 12

你可以使用混合技术.

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

批处理代码在多行字符串中,'''因此对于python来说这是不可见的.
批处理解析器没有看到python代码,因为它之前退出.

第一行是关键.
它对批处理也有效,对于python也是如此!
在python中,它只是1>2没有输出的无意义比较,其余部分是由注释#.

对于批处理1>2#是将流重定向1到文件2#.
命令是一个冒号,:表示标签,标记的行永不打印.
然后最后一个插入符只是将下一行附加到标签行,因此批处理不会看到该'''行.