【问题标题】:Running shell command from Python script从 Python 脚本运行 shell 命令
【发布时间】:2012-04-01 16:13:48
【问题描述】:

我正在尝试从需要做几件事的 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() 还是默认等待?

【问题讨论】:

标签: python


【解决方案1】:

只需在.communicate() 之后使用.returncode。另外,告诉 Popen what you're trying to run is a shell command,而不是原始命令行:

p = subprocess.Popen('ls | tee out.txt', shell=True, ...)
p.communicate()
print p.returncode

【讨论】:

  • 谢谢,成功了。我已经用我现在使用的代码更新了我的问题。你知道如何在 shell 命令中指定 PIPE 和重定向吗?
  • @Ronin:您似乎不太喜欢文档,它与我链接的段落完全相同。为了您的最大方便,我还为此添加了示例代码。
  • Niklas,在发布这个问题之前,我指的是文档。我的错误是我将 Popen 的参数指定为匿名数组。我对python很陌生;我会接受训诫。感谢您的代码。
  • @Ronin:在这种情况下,不用担心。很高兴为您提供帮助,玩得开心编码,如果您需要帮助,请返回此站点 :)
【解决方案2】:

这里是如何与 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'
>>> 

【讨论】:

    【解决方案3】:

    来自the docs

    Popen.returncode

    子返回码,由poll()wait() 设置(间接由communicate() 设置)。 None 值表示该进程尚未终止。

    负值-N 表示子进程被信号N 终止(仅限Unix)。

    【讨论】: