使用python脚本启动shell命令,等待终止并返回脚本

时间:2008-11-28 10:42:03

标签: python subprocess popen os.execl

我有一个python脚本,必须为dir中的每个文件启动一个shell命令:

import os

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

这适用于第一个文件,但在“myscript”命令结束后,执行停止并且不会返回到python脚本。

我该怎么办?在fork()之前我需要calling os.execlp()吗?

7 个答案:

答案 0 :(得分:86)

  

子流程:subprocess模块   允许您生成新进程,   连接到他们的输入/输出/错误   管道,并获得他们的返回代码。

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

用法:

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

答案 1 :(得分:59)

您可以使用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()

答案 2 :(得分:12)

自2008年以来,子流程模块已经出现。特别是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 )
    stdout将被抑制(请注意myscript产生的输出超过4k)。除非您添加选项stderr=subprocess.PIPE
  • ,否则仍会显示stderr
  • check_output( [ 'myscript', f ] )
    check_output将stdout作为字符串返回,因此未显示。除非您添加选项stderr=subprocess.STDOUT
  • ,否则仍会显示stderr

答案 3 :(得分:7)

os.exec*()函数当前程序替换为新程序。当这个程序结束时,你的过程也是如此。您可能需要os.system()

答案 4 :(得分:3)

使用spawn

import os
os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')

答案 5 :(得分:0)

我使用os.system

import os
os.system("pdftoppm -png {} {}".format(path2pdf, os.path.join(tmpdirname, "temp")))

答案 6 :(得分:0)

这对我来说很好!

INSERT,CREATE command denied to user 'SchemaExample1'@'localhost' for table 'test_testTable2'