在Python脚本中启动shell命令,等待终止后返回脚本

82 投票
7 回答
215996 浏览
提问于 2025-04-11 20:04

我有一个Python脚本,它需要对目录中的每个文件执行一个命令:

import os

files = os.listdir(".")
for f in files:
    os.execlp("myscript", "myscript", f)

这个方法对第一个文件运行得很好,但在“myscript”命令结束后,执行就停下来了,回不到Python脚本里。

我该怎么做呢?我需要在调用os.execlp()之前使用fork()吗?

7 个回答

13

自2008年以来,subprocess模块有了很大的进步。特别是check_callcheck_output这两个功能,让处理子进程变得更加简单。check_*系列的函数很不错,因为如果出现问题,它们会抛出一个异常。

import os
import subprocess

files = os.listdir('.')
for f in files:
   subprocess.check_call( [ 'myscript', f ] )

任何由myscript生成的输出都会显示得像是你的程序产生的输出(从技术上讲,myscript和你的Python脚本共享同一个输出流)。不过,有几种方法可以避免这种情况。

  • check_call( [ 'myscript', f ], stdout=subprocess.PIPE )
    这样设置后,输出会被抑制(如果myscript的输出超过4k,需小心)。错误输出仍然会显示,除非你加上选项stderr=subprocess.PIPE
  • check_output( [ 'myscript', f ] )
    check_output会把标准输出作为字符串返回,所以不会显示出来。错误输出仍然会显示,除非你加上选项stderr=subprocess.STDOUT
66

你可以使用 subprocess.Popen。有几种方法可以做到这一点:

import subprocess
cmd = ['/run/myscript', '--arg', 'value']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in p.stdout:
    print line
p.wait()
print p.returncode

或者,如果你不在乎外部程序到底做了什么:

cmd = ['/run/myscript', '--arg', 'value']
subprocess.Popen(cmd).wait()
128

subprocess:subprocess模块可以让你创建新的进程,连接它们的输入、输出和错误信息的通道,还能获取它们的返回码。

http://docs.python.org/library/subprocess.html

用法:

import subprocess
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
process.wait()
print process.returncode

撰写回答