使用Python从shell脚本中提取错误消息?

时间:2013-12-27 06:33:24

标签: 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"
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

  1. 首先,这是解决这类问题的正确方法吗? 基本上,我想首先打印start,如果shell脚本得到了 成功执行,然后我想打印end。但如果是的话 无论什么原因,我的shell脚本没有成功执行, 那我就不打印end
  2. 其次,通过这种方法,我无法看到我的echo语句从shell脚本打印到控制台上?这是不是意味着,我的shell脚本正在执行,但它不会以某种方式在控制台上打印出来?
  3. 第三,是否有可能从shell脚本中提取错误消息,这意味着shell脚本失败的原因是什么?

1 个答案:

答案 0 :(得分:1)

1。是的,您的代码似乎符合您的意图。

2。正确。由于您使用了stdout=subprocess.PIPEstderr=subprocess.PIPE,因此您将在bash脚本中看不到控制台上的输出。但是,当您调用stdout时,变量stderrcommunicate()的下一行会捕获到stdout和stderr的输出。

3。是的,您已经这样做了:只需检查stderr变量的内容,它将包含您的shell脚本打印的所有错误消息。