当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用python脚本启动shell命令,等待终止并返回脚本》经验,为你挑选了4个好方法。

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

import os

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

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

我能怎么做?我fork()以前需要calling os.execlp()吗?



1> user39307..:

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


较新版本的文档位于http://docs.python.org/library/subprocess.html.
如果子程序产生足够的输出(在Linux上大约65KB),则删除stdout = PIPE它可能会挂起脚本.`shell = True`是不必要的.
如果没有shell = True,它将在python 2.7上引发一个异常...文件“ /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,行1335,在_execute_child中引发child_exception OSError :[Errno 2]没有这样的文件或目录

2> Harley Holco..:

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



3> deft_code..:

自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将stdout作为字符串返回,因此未显示.除非您添加选项,否则仍会显示stderr stderr=subprocess.STDOUT.


@Luke Stanley:你的问题不清楚,但我会试一试.`subprocess.check_*`函数使得调用外部二进制文件比使用`subprocess.Popen`手动调用更容易.特别是你永远不需要处理`wait()`,`communic()`,`return_code`等等.你也不需要担心拖延可执行文件的悬挂管道等陷阱.当使用外部二进制文件_interacting_时,`check_*`函数并没有太大的帮助,但对于大多数用例,结果更短,更不容易出错,也更容易.

4> 小智..:

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

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有