如何使用Python中的子进程模块检查shell脚本的状态?

时间:2013-12-27 03:45:08

标签: python bash shell subprocess

我有一个简单的Python脚本,它将使用Python中的subprocess mdoule执行shell脚本。

下面是我的Python shell脚本,它调用testing.sh shell脚本,它运行正常。

import os
import json
import subprocess

jsonData = '{"pp": [0,3,5,7,9], "sp": [1,2,4,6,8]}'
jj = json.loads(jsonData)

print jj['pp']
print jj['sp']

os.putenv( 'jj1',  'Hello World 1')
os.putenv( 'jj2',  'Hello World 2')
os.putenv( 'jj3', ' '.join( str(v) for v in jj['pp']  ) )
os.putenv( 'jj4', ' '.join( str(v) for v in jj['sp']  ) )

print "start"
subprocess.call(['./testing.sh'])
print "end"

以下是我的shell脚本 -

#!/bin/bash

for el1 in $jj3
do
    echo "$el1"
done

for el2 in $jj4
do
    echo "$el2"
done

for i in $( david ); do
    echo item: $i
done

现在我的问题是 -

如果你看到我的Python脚本,我打印start,然后执行shell脚本,然后打印end ..所以假设无论出于什么原因我正在执行的shell脚本有任何问题,那么我不想打印end

所以在上面的例子中,shell脚本将无法正常运行,因为david不是linux命令,所以它会抛出错误。那么我应该如何看待整个bash shell脚本的状态,然后决定是否需要打印end

我刚刚添加了一个for循环示例,它可以是任何shell脚本..

有可能吗?

3 个答案:

答案 0 :(得分:1)

只需使用call()的返回值:

import subprocess

rc = subprocess.call("true")
assert rc == 0 # zero exit status means success
rc = subprocess.call("false")
assert rc != 0 # non-zero means failure

如果命令失败而不是手动检查返回的代码,您可以使用check_call()自动引发异常:

rc = subprocess.check_call("true") # <-- no exception
assert rc == 0

try:
    subprocess.check_call("false") # raises an exception
except subprocess.CalledProcessError as e:
    assert e.returncode == 1
else:
    assert 0, "never happens"

答案 1 :(得分:0)

好吧,根据the docs,.call会将退出代码返回给您。但是,您可能希望检查是否确实收到了错误返回码。 (我认为for循环仍会返回0代码,因为它或多或少已完成。)

答案 2 :(得分:0)

您可以检查bash脚本的stderr而不是返回代码。

proc = subprocess.Popen('testing.sh', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
if stderr:
   print "Shell script gave some error"
else:
   print "end" # Shell script ran fine.