我有一个简单的Python脚本,它将使用subprocess
Python中的模块执行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
OR复制machineC
到machineA
。如果文件不在其中,machineB
则应machineC
始终在其中。因此它将尝试将文件从复制machineB
到,machineA
但是如果文件不存在,machineB
它将尝试将文件从复制machineC
到machineA
。
现在,我上面的Python脚本(我从中运行machineA
)试图执行我上面的shell脚本,并查看我的脚本是否成功执行。当我存储stderr
外壳脚本的时,stdout
也是如此。
问题陈述:-
通过上述方法,我看到了一个问题。如前所述,如果文件不存在machineB
,它将尝试将文件从复制machineC
到machineA
。因此,每当我运行调用我的Shell脚本的Python脚本时,发生的事情是,其中没有某些文件,machineB
因此它引发了一些异常,然后尝试从中复制文件,machineC
但是当调用返回到Python脚本时,它总是内部if stderr:
块,因为从中复制文件时出现错误machineB
(这不是我想要的),并且end
print语句未打印出来。
因此,问题是文件是否不存在machineB
,它将尝试从中复制文件machineC
,如果文件存在machineC
并且成功复制到文件machineA
而没有任何错误,那么我想将其称为success
而不是failure
。在当前情况下,如果文件不存在machineB
并成功复制了文件,machineC
则仍然会发生故障,end
并且不会打印输出打印语句。
我还想查看从Python执行时我的shell脚本是否有问题。如果是,那么我不想打印end
声明。
我应该如何克服这个问题?
更新:-
下面的shell脚本会发生什么?因为第一个for循环将失败,因为david不是linux命令,但是我的scp命令可以正常工作。所以我仍然会看到状态码不等于0?
for i in $( david ); do
echo item: $i
done
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
Popen.returncode
The child return code, set by poll() and wait() (and indirectly by communicate()). A None value indicates that the process hasn’t terminated yet. A negative value -N indicates that the child was terminated by signal N (Unix only).
因此,您可以使用以下命令检查退出状态:
proc.returncode
但具有讽刺意味的是,Python中的零0
表示False
。
例子 :
if (var == False) :
# this will execute if var is False or 0 (or 0.0, 0L, 0j)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句