我有一个简单的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"
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.
以下是我的testing.sh
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脚本,如果执行我的shell脚本时出现任何错误,那么它将不会打印出end
。在上面的示例中,由于出现错误,它不会打印出end
。
start
,如果shell脚本得到了
成功执行,然后我想打印end
。但如果是的话
无论什么原因,我的shell脚本没有成功执行,
那我就不打印end
。答案 0 :(得分:1)
1。是的,您的代码似乎符合您的意图。
2。正确。由于您使用了stdout=subprocess.PIPE
和stderr=subprocess.PIPE
,因此您将在bash脚本中看不到控制台上的输出。但是,当您调用stdout
时,变量stderr
和communicate()
的下一行会捕获到stdout和stderr的输出。
3。是的,您已经这样做了:只需检查stderr
变量的内容,它将包含您的shell脚本打印的所有错误消息。