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

dbr*_*dbr 39 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
Run Code Online (Sandbox Code Playgroud)

monkut的评论:用例不明确.为什么要使用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)
Run Code Online (Sandbox Code Playgroud)

另外,我想捕获stdout和stderr以便调试出错的地方.

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

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

dbr*_*dbr 62

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

import sys
import subprocess

theproc = subprocess.Popen([sys.executable, "myscript.py"])
theproc.communicate()
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用`subprocess.check_call([sys.executable,"myscript.py"])`. (3认同)
  • 或者更好的是,在 Python 3.5+ 中,使用 [`subprocess.run`](https://docs.python.org/3/library/subprocess.html#subprocess.run):`subprocess.run([sys.executable , 'myscript.py'], check=True)` (2认同)

Rom*_*kov 21

这个怎么样:

import sys
import subprocess

theproc = subprocess.Popen("myscript.py", shell = True)
theproc.communicate()                   # ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

另外,这将在PATH中搜索"myscript.py" - 这可能是理想的.

  • 这是两种情况明显不同的情况.假设"myscript.py"在系统PATH中,而不在当前目录中.如果使用"shell = True",脚本将在PATH上找到,但如果使用"sys.executable"则不会. (2认同)

小智 6

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

subprocess.Popen(['myscript.py', 'arg1', ...], ..., shell=True)
Run Code Online (Sandbox Code Playgroud)


vik*_*sit 5

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

python /the/script.py
Run Code Online (Sandbox Code Playgroud)

尝试,

subprocess.Popen(["python", "/the/script.py"])
Run Code Online (Sandbox Code Playgroud)

编辑:“python”需要在您的路径上。