从Python脚本执行时如何检查bash shell脚本的状态?

兵工厂

我有一个简单的Python脚本,它将使用subprocessPython中的模块执行Shell脚本

下面是我的Python Shell脚本,它正在调用testing.shShell脚本,并且运行良好。

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.shshell脚本-

#!/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脚本所做的是,它将文件从machineBOR复制machineCmachineA如果文件不在其中,machineB则应machineC始终在其中。因此它将尝试将文件从复制machineB到,machineA但是如果文件不存在,machineB它将尝试将文件从复制machineCmachineA

现在,我上面的Python脚本(我从中运行machineA)试图执行我上面的shell脚本,并查看我的脚本是否成功执行。当我存储stderr外壳脚本的时,stdout也是如此。

问题陈述:-

通过上述方法,我看到了一个问题。如前所述,如果文件不存在machineB,它将尝试将文件从复制machineCmachineA因此,每当我运行调用我的Shell脚本的Python脚本时,发生的事情是,其中没有某些文件,machineB因此它引发了一些异常,然后尝试从中复制文件,machineC但是当调用返回到Python脚本时,它总是内部if stderr:块,因为从中复制文件时出现错误machineB(这不是我想要的),并且endprint语句未打印出来。

因此,问题是文件是否不存在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
拉胡尔·帕蒂尔(Rahul Patil)

Python子进程Doc中

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)

阅读Python陷阱

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何设置shell脚本的退出状态?

来自分类Dev

如何检查启动后台进程的bash脚本的执行时间

来自分类Dev

如何使用bash shell脚本检查文本文件中URL的状态

来自分类Dev

从shell脚本中的函数捕获退出状态

来自分类Dev

如何执行shell脚本?

来自分类Dev

如何执行shell脚本?

来自分类Dev

如何从任何目录执行bash shell脚本?

来自分类Dev

在Unix Shell脚本中检查psql命令的返回状态

来自分类Dev

在执行测试之前检查 HTTP 状态的 Bash 脚本

来自分类Dev

从节点脚本执行时如何查看bash命令

来自分类Dev

通过符号链接执行时,如何获取Bash脚本的路径?

来自分类Dev

如何(仅)在Shell脚本中获得网站的http状态?

来自分类Dev

Bash Shell脚本检查器

来自分类Dev

从Java代码内部执行时,如何访问Shell脚本输出?

来自分类Dev

如何执行bash脚本?

来自分类Dev

如何从Python脚本在后台执行Shell脚本

来自分类Dev

如何使bash脚本使用特定的python版本执行python脚本?

来自分类Dev

如何从soapui groovy脚本执行shell脚本?

来自分类Dev

如何从soapui groovy脚本执行shell脚本?

来自分类Dev

从 python 脚本执行 shell 脚本有困难

来自分类Dev

Shell脚本在失败时不记录Java退出状态

来自分类Dev

使用“保留”代码获取shell脚本的退出状态

来自分类Dev

使用“保留”代码获取shell脚本的退出状态

来自分类Dev

Shell脚本从给定的输出中检索对象的状态

来自分类Dev

tmux状态栏中的无限循环shell脚本

来自分类Dev

Shell脚本在失败时不记录Java退出状态

来自分类Dev

从Shell脚本中的curl检索HTTP状态代码和内容

来自分类Dev

如何从Hubot执行Shell脚本

来自分类Dev

如何从PHP脚本执行Shell

Related 相关文章

热门标签

归档