用Python脚本运行Shell命令

4
我想在Python脚本中运行一个shell命令,并需要做以下几件事情:
1. shell命令为'hspice tran.deck >! tran.lis'
2. 脚本应该等待shell命令完成后再继续
3. 我需要检查命令的返回代码,
4. 如果成功执行则捕获STDOUT,否则捕获STDERR

我使用subprocess模块尝试了几个方法,但无法找到同时满足以上所有条件的方法。
- 使用subprocess.call(),我可以检查返回代码但无法捕获输出。
- 使用subprocess.check_output(),我可以捕获输出但无法获取代码。
- 使用subprocess.Popen()和Popen.communicate(),我可以捕获STDOUT和STDERR但无法获取返回代码。
我不确定如何使用Popen.wait()或returncode属性。我也无法让Popen接受“>!”或“|”作为参数。

请有人指点一下方向吗?我正在使用Python 2.7.1版本。

编辑:我用以下代码使事情运转起来了。

process = subprocess.Popen('ls | tee out.txt', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
if(process.returncode==0):
  print out
else:
  print err

此外,在process = line之后,我应该使用process.wait(),还是它默认会等待?

1
communicate() 等待进程退出 http://docs.python.org/library/subprocess.html#subprocess.Popen.communicate - RedBaron
3个回答

10
只需在.communicate()后使用.returncode。另外,请告诉Popen你要运行的是一个shell命令,而不是一个原始的命令行:(参见此处)
p = subprocess.Popen('ls | tee out.txt', shell=True, ...)
p.communicate()
print p.returncode

谢谢,那个方法可行。我已经更新了我的问题,并附上了我现在正在使用的代码。您知道如何在shell命令中指定PIPE和重定向吗? - kshenoy
@Ronin:你似乎不太喜欢文档,但它就在我链接的同一段落中。为了方便起见,我还添加了示例代码。 - Niklas B.
Niklas,在我发布这个问题之前,我已经参考了文档。我的错误在于将参数指定为匿名数组。我对Python非常陌生,我接受批评。感谢您提供的代码。 - kshenoy
1
@Ronin:在这种情况下,没问题。很高兴能帮助你,享受编码的乐趣,如果需要帮助,请回到这个网站 :) - Niklas B.

3

来自文档

Popen。returncode

子进程的返回代码,由poll()wait()(以及间接地由communicate())设置。None表示进程尚未终止。

负值-N表示子进程被信号N终止(仅适用于Unix系统)。


-1

这里是与shell交互的示例:

>>> process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> process.stdin.write('echo it works!\n')
>>> process.stdout.readline()
'it works!\n'
>>> process.stdin.write('date\n')
>>> process.stdout.readline()
'wto, 13 mar 2012, 17:25:35 CET\n'
>>> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接