使用子进程在Windows上运行Python脚本

时间:2009-05-26 21:22:13

标签: python windows subprocess

是否有一种在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's评论:用例不明确。为什么要使用subprocess来运行python脚本?是否有什么东西阻止您导入脚本并调用必要的函数?

我正在编写一个快速脚本来测试Python命令行工具的整体功能(在各种平台上测试它)。基本上它必须在临时文件夹中创建一堆文件,在此上运行脚本并检查文件是否已正确重命名。

我本可以导入脚本并调用该函数,但由于它依赖于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以便调试出错的地方。

当然更好的方法是以更可单元测试的方式编写脚本,但脚本基本上是“完成”,我在做一个“1.0”版本之前做了最后一批测试(之后我我将进行重写/重组,这将更加整洁,更加可测试。

基本上,在找到sys.executable变量后,简单地将脚本作为一个进程运行起来要容易得多。我会把它写成一个shell脚本,但这不会是跨平台的。最终的脚本可以找到here

7 个答案:

答案 0 :(得分:60)

刚刚找到sys.executable - 当前Python可执行文件的完整路径,可用于运行脚本(而不是依赖于shbang,显然在Windows上不起作用)

import sys
import subprocess

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

答案 1 :(得分:21)

这个怎么样:

import sys
import subprocess

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

这告诉subprocess使用操作系统shell打开您的脚本,并处理您可以在cmd.exe中运行的任何内容。

此外,这将在PATH中搜索“myscript.py” - 这可能是理想的。

答案 2 :(得分:6)

是的subprocess.Popen(cmd, ..., shell=True)就像一个魅力。在Windows上,.py文件扩展名被识别,因此调用Python来处理它(在* NIX上只是通常的shebang)。路径环境控制是否可以看到事物。因此Popen的第一个参数是,只是脚本的名称

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

答案 3 :(得分:4)

看起来windows试图使用自己的EXE框架运行脚本,而不是像

那样调用它
python /the/script.py

尝试,

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

编辑:“python”需要在你的道路上。

答案 4 :(得分:2)

您正在使用与平台相关的路径名分隔符。 Windows使用“\”,Unix使用“/".

答案 5 :(得分:2)

例如,要使用命令提示符或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)

答案 6 :(得分:1)

当您在子进程中的Windows上运行python脚本时,您应该在脚本名称前面使用python。尝试:

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