使用subprocess在Windows上运行Python脚本

有没有简单的方法来在Windows / Linux / OS X上运行Python脚本?

在后两个, subprocess.Popen("/the/script.py")作品,但在Windows上,我得到以下错误:

 Traceback (most recent call last): File "test_functional.py", line 91, in test_functional log = tvnamerifiy(tmp) File "test_functional.py", line 49, in tvnamerifiy stdout = PIPE File "C:\Python26\lib\subprocess.py", line 595, in __init__ errread, errwrite) File "C:\Python26\lib\subprocess.py", line 804, in _execute_child startupinfo) WindowsError: [Error 193] %1 is not a valid Win32 application 

monkut的评论 :用例不清楚。 为什么使用subprocess来运行一个python脚本? 有什么东西阻止你导入脚本并调用必要的function吗?

我正在编写一个快速脚本来testingPython命令行工具的全部function(以在各种平台上testing它)。 基本上它必须在临时文件夹中创build一堆文件,在这个文件上运行脚本并检查文件是否被正确地重命名。

我可以导入脚本,并调用函数,但由于它依赖于sys.argv并使用sys.exit() ,我将需要做的事情就像..

 import sys import tvnamer sys.argv.append("-b", "/the/folder") try: tvnamer.main() except BaseException, errormsg: print type(errormsg) 

另外,我想捕获stdout和stderr进行debugging,以防止出现问题。

当然,更好的方法是以更多的unit testing的方式编写脚本,但是脚本基本上是“完成的”,并且在做“1.0”版本之前做了最后一批testing(之后我要去做一个重写/重组,这将是更加整洁和更可testing的)

基本上,findsys.executablevariables之后,简单地将脚本作为一个进程来运行就容易多了。 我会把它写成一个shell脚本,但是这不会是跨平台的。 最后的脚本可以在这里find

刚刚findsys.executable – 当前Python可执行文件的完整path,可以用来运行脚本(而不是依靠shbang,这在Windows上显然不起作用)

 import sys import subprocess theproc = subprocess.Popen([sys.executable, "myscript.py"]) theproc.communicate() 

这个怎么样:

 import sys import subprocess theproc = subprocess.Popen("myscript.py", shell = True) theproc.communicate() # ^^^^^^^^^^^^ 

这告诉subprocess使用OS shell打开你的脚本,并且可以运行在cmd.exe中运行的任何东西。

此外,这将searchPATH“myscript.py” – 这可能是可取的。

subprocess.Popen(cmd, ..., shell=True)就像一个魅力。 在Windows上, .py文件扩展名被识别,所以Python被调用来处理它(在* NIX中只是通常的shebang)。 path环境控制事物是否被看见。 所以Popen的第一个arg就是脚本的名字

 subprocess.Popen(['myscript.py', 'arg1', ...], ..., shell=True) 

它看起来像Windows试图运行自己的EXE框架而不是调用它的脚本

 python /the/script.py 

尝试,

 subprocess.Popen(["python", "/the/script.py"]) 

编辑:“python”将需要在你的path。

您正在使用与平台相关的path名分隔符。 Windows使用“\”而Unix使用“/”。

当你在subprocess的窗口上运行python脚本时,你应该在脚本名称前面使用python。 尝试:

 process = subprocess.Popen("python /the/script.py") 

例如,要执行下面的命令提示符或BATCH文件,我们可以使用这个:

 C:\Python27\python.exe "C:\Program files(x86)\dev_appserver.py" --host 0.0.0.0 --post 8080 "C:\blabla\" 

与Python同样的事情,我们可以这样做:

 subprocess.Popen(['C:/Python27/python.exe', 'C:\\Program files(x86)\\dev_appserver.py', '--host', '0.0.0.0', '--port', '8080', 'C:\\blabla'], shell=True) 

要么

 subprocess.Popen(['C:/Python27/python.exe', 'C:/Program files(x86)/dev_appserver.py', '--host', '0.0.0.0', '--port', '8080', 'C:/blabla'], shell=True)