在 python 脚本中启动一个 shell 命令,等待终止并返回到脚本

问题描述 投票:0回答:7

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

import os

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

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

我该怎么做?我必须在

fork()
之前
calling os.execlp()
吗?

python subprocess popen os.execl
7个回答
124
投票

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

65
投票

您可以使用

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()

13
投票

子流程模块自 2008 年以来一直沿用至今。特别是

check_call
check_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 仍将显示,除非您添加选项
    stderr=subprocess.PIPE
    .
  • check_output( [ 'myscript', f ] )

    check_output
    将标准输出作为字符串返回,因此不显示。 stderr 仍然显示,除非你添加选项
    stderr=subprocess.STDOUT
    .

7
投票

os.exec*()
功能用新程序替换当前程序。当这个程序结束时,你的过程也会结束。你可能想要
os.system()
.


3
投票

使用产卵

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

2
投票

我用os.system

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

1
投票

这对我有用!

shell_command = "ls -l"
subprocess.call(shell_command.split())

© www.soinside.com 2019 - 2024. All rights reserved.