Confer http://docs.python.org/library/subprocess.html http://docs.python.org/library/subprocess.html.
Communications() 返回一个元组 (stdoutdata, stderrdata)。
子进程完成后,您可以从 Popen 实例获取返回码:
Popen.returncode:子级返回代码,由 poll() 和 wait() 设置(以及通过communicate() 间接设置)。
同样,您可以这样实现您的目标:
sp = subprocess.Popen([executable, arg1, arg2], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = sp.communicate()
if out:
print "standard output of subprocess:"
print out
if err:
print "standard error of subprocess:"
print err
print "returncode of subprocess:"
print sp.returncode
顺便说一句,我会改变测试
if script.endswith('.*~') or script == 'README':
continue
转化为积极的一面:
if not filename.endswith(".sh"):
continue
明确你想要执行什么比明确你要做什么更好not想要执行。
另外,您应该以更通用的方式命名变量,因此script
应该filename
首先。作为listdir
还列出了目录,您可以明确检查这些目录。您当前的try/except
只要您不处理特定的异常,块就是不正确的。代替abspath
,你应该只是连接initdir
and filename
,这是一个经常在上下文中应用的概念os.listdir()
。出于安全原因,请使用shell=True
在构造函数中Popen
仅当您绝对确定需要时才反对。让我提出以下建议:
for filename in sorted(os.listdir(initdir), reverse=reverse):
if os.path.isdir(filename) or not filename.endswith(".sh"):
continue
if os.access(script, os.X_OK):
exepath = os.path.join(initdir, filename)
sp = subprocess.Popen(
(exepath, 'stop' if reverse else 'start'),
stderr=subprocess.PIPE,
stdout=subprocess.PIPE)
out, err = sp.communicate()
print out, err, sp.returncode