在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脚本…