我有一个简单的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
了 - 其次,使用这种方法,我看不到我的echo语句从shell脚本打印到控制台上?这是否意味着,我的shell脚本正在执行,但不知怎么的,它没有打印在控制台上
- 第三,是否有可能从shell脚本中提取错误消息,这意味着shell脚本失败的原因是什么
1。是的,您的代码似乎符合您的意图。
2.正确。因为使用了stdout=subprocess.PIPE
和stderr=subprocess.PIPE
,所以在控制台上看不到bash脚本的输出。但是,当调用communicate()
时,stdout和stderr的输出将在变量stdout
和stderr
的下一行捕获。
3.是的,您已经这样做了:只需检查stderr
变量的内容,它就会保存shell脚本打印的所有错误消息。