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

如何使用Python中的子流程模块检查shell脚本的状态?,python,bash,shell,subprocess,Python,Bash,Shell,Subprocess,我有一个简单的Python脚本,它将使用Python中的subprocessmdoule执行一个shell脚本 下面是我的pythonshell脚本,它正在调用testing.shshell脚本,并且运行良好 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['

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

下面是我的pythonshell脚本,它正在调用
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命令,因此它将抛出一个错误。那么,我应该如何查看整个bashshell脚本的状态,然后决定是否需要打印
end

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


有可能吗?

好的,根据。call会将退出代码返回给您。不过,您可能需要检查是否确实获得了错误返回代码。(我认为for循环仍然会返回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.

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

如果命令失败,您可以使用
check\u 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"

rc=subprocess。检查调用(“true”)#谢谢。您能否提供一个示例,其中shell脚本将失败,退出状态返回为1而不是0。。只是想了解它是如何工作的。默认情况下,shell脚本将返回其上一个命令的状态。在我看来,for循环将返回最后一个内部命令的状态,或者,如果循环根本没有运行(如本例所示),则返回0表示成功。所以如果你改变事情,让错误最后发生;或者,如果在脚本中放入显式返回1,您将看到1而不是0。谢谢Aro,它工作得很好。。但是我没有看到我的shell脚本的任何输出。。正如您所看到的,我的shell脚本中有几个echo命令。。这是否意味着我的shell脚本命令正在执行,但没有打印出来?您的输出是变量-stdout。如果您想在屏幕上显示,可以使用stdout=subprocess.STDOUTThanks Aro:这样我就可以安全地假设我的shell脚本正在执行,但结果存储在stdout变量中?对的
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"