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

时间:2013-07-04 10:02:40

标签: python windows bash batch-file

在bash中,我们可以:

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

在bash脚本中嵌入python代码段。

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

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

感谢。

6 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:11)

你可以使用混合技术。

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也是有效的! 在python中,它只是一个无意义的比较1>2没有输出,行的其余部分是#的注释。

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

答案 2 :(得分:1)

不要错过你必须立即在批处理文件中指定python脚本的想法。将python代码放在​​一个单独的文件中,然后只需从Windows批处理文件中启动python下的单独文件。

答案 3 :(得分:0)

我知道这样做的唯一方法是从批处理文件中调用Python脚本,如下所示:

@echo off
REM whatever other code
python python_script.py
REM rest of batch file...

答案 4 :(得分:0)

whoami /priv

可以包含任何字符或字符串,但只能包含“!”感叹是除了。 '!'用于变量,因此您必须设置'DisableDelayedExpansion'。最后,你必须设置'endlocal'。就是这样。

您可以将此例程用于任何脚本或任何文档。即使是cmd脚本......

答案 5 :(得分:0)

一个简单的命令:Windows cmd提示符仅理解双引号,因此您可以将它们加倍以使其与// Declared in Constructor this.taxHttpOptions = { headers: new HttpHeaders( { "Authorization": "Basic " + btoa('testTEST123:fff'), "Content-Type": "application/json", }, ) } attemptPOST(){ var dataString = `[{ "unique_id":"record1", "record_type":"S", "account_number":"15301", "customer_type":1, "location_a":"60515", "invoice_date":"20170401", "invoice_number":"1310556", "userdef2":"Hi There !!", "product_code":"V001", "service_code":2, "provider":3, "charge_amount":100, "units":1 }]`; this.http.post('https://abctest.com/api/batches', dataString, this.taxHttpOptions) .subscribe( data => { console.log(data) } ) } 选项一起使用:

-c

或使用Windows cmd根本无法解释的简单引号:

python -c print("""Hi""")