我有一个简单的Python脚本,它将使用Python中的subprocess
模块执行shell脚本。
下面是我的Python shell脚本,它调用testing.sh
shell脚本,它运行正常。
import os
import json
import subprocess
jsonData = '{"pp": [0,3,5,7,9]}'
jj = json.loads(jsonData)
os.putenv( 'jj3', ' '.join( str(v) for v in jj['pp'] ) )
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"
print stderr
else:
print stdout
print "end" # Shell script ran fine.
以下是我的testing.sh
shell脚本 -
#!/bin/bash
dir1=some_directory
dir2=some_directory
length1=some_number
length2=some_number
if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
for el in $jj3
do
scp david@machineB:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/. || scp david@machineC:/data/be_t1_snapshot/20131215/t1_"$el"_5.data /data01/primary/.
done
fi
我的上述shell脚本的作用是,它会将文件从machineB
或machineC
复制到machineA
。如果machineB
中的文件不存在,那么它始终存在于machineC
中。因此,它会尝试将文件从machineB
复制到machineA
,但如果machineB
中的文件不存在,则会尝试将文件从machineC
复制到{{} 1}}。
现在我上面的Python脚本(我从machineA
运行)尝试执行我的上面的shell脚本,看看我的脚本是否成功执行。正在我存储我的shell脚本的machineA
和stderr
。
问题陈述: -
通过上述方法,我看到了一个问题。正如我所提到的,stdout
中的文件不存在,那么它会尝试将文件从machineB
复制到machineC
。因此,每当我运行调用我的shell脚本的Python脚本时,会发生的情况是,machineA
中没有某些文件,因此会抛出一些异常,然后尝试从machineB
复制文件,但是调用回到Python脚本,它总是进入machineC
块,因为从if stderr:
复制文件时出错(这不是我想要的)和machineB
print statement doesn'打印出来。
所以问题是如果end
中没有文件,它会尝试从machineB
复制文件,如果文件存在machineC
并成功复制到machineC
{1}}没有任何错误,我想将其称为machineA
而不是success
。在当前情况下发生了什么,如果failure
中的文件不存在并且已成功从machineB
复制,那么它仍会被视为失败并且machineC
打印语句不会被打印出来
我还想看看我的shell脚本在从Python执行时是否有任何问题。如果是,那么我不想打印end
声明。
我该如何克服这个问题?
更新: -
以下shell脚本会发生什么?由于第一个end
循环失败,因为for
不是linux命令,但我的david
命令工作正常。所以我仍然会看到状态代码不等于scp
?
0
答案 0 :(得分:0)
正常运行的流程仍然可以写入stderr
,因此使用if stderr:
检查问题是错误的
相反,您应该检查进程退出代码。如果它不等于零,则出现错误,例如:
[...]
if proc.returncode != 0:
print "Shell script gave some error"
[...]