繁体   English   中英

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

[英]Launch a shell command with in a python script, wait for the termination and return to the script

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

import os

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

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

我能怎么做? 我一定要fork()之前calling os.execlp()

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

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

用法:

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

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

check_call模块从 2008 年开始出现。特别是check_callcheck_output使简单的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 )
    标准输出将被抑制(如果myscript产生超过 4k 的输出,请注意)。 除非您添加选项stderr=subprocess.PIPE否则仍会显示stderr=subprocess.PIPE
  • check_output( [ 'myscript', f ] )
    check_output将标准输出作为字符串返回,因此未显示。 除非您添加选项stderr=subprocess.STDOUT否则仍会显示stderr=subprocess.STDOUT

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

使用生成

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

我使用 os.system

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

这对我有用!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM