我正在尝试从python脚本中运行一个shell命令,需要做几件事
1. shell命令是'hspice tran.deck>! tran.lis'
2.在继续执行之前,脚本应该等待shell命令完成
我需要检查命令的返回码和
4.如果成功完成则捕获STDOUT,否则捕获STDERR
我浏览了子进程模块并试了几件但是找不到上述所有方法。
- 使用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()还是默认等待?
答案 0 :(得分:10)
在.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
答案 1 :(得分:3)
来自the docs:
Popen.
的returncode
强>子代码返回代码,由
poll()
和wait()
设置(间接由communicate()
设置)。 “无”值表示该进程尚未终止。负值
-N
表示孩子被信号N
终止(仅限Unix)。
答案 2 :(得分:-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'
>>>