我有一个简单的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脚本..
有可能吗?
答案 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.