我有一个在其中调用Python的shell脚本。

#! /bin/bash

shopt -s extglob

echo"====test===="

~/.conda/envs/my_env/bin/python <

import sys

import os

try:

print("inside python")

x = 2/0

except Exception as e:

print("Exception: %s" % e)

sys.exit(2)

print("at the end of python")

EOF

echo"end of script"

如果我执行此操作,下面的行仍然会打印出来。

"end of script"

我想在python脚本的异常块中退出shell并让脚本不能到达EOF

有没有办法在上面的except块中创建和终止subprocess,这会杀死整个shell脚本?

我可以通过杀死整个shell脚本来生成一个虚拟子进程并在异常块内杀死它吗?

任何例子都会有所帮助。

提前致谢。

只需保存你调用python的行的返回值,并在EOF之后检查它

或者具有非零返回码状态退出shell(set -e)。 也不要做sys.exit(-1)。 退出代码是正面的。 便携式方面0-255

@ Jean-FranoisFabre我不想set -e因为我希望一些错误无声地失败并继续在脚本中运行,但特别是这个python异常会杀死整个脚本。 谢谢,不会使用-1,编辑帖子。

这个问题不重复......

@ritlew为什么不重复? 它基本上归结为你评论的内容(查看链接)。

问题是如何根据python脚本的作用退出脚本,正如提问者所重申的那样。

它出现了,被问到的人接受了答案......这是前一个重复链接中的一个副本。 你对提问者想要的内容的解释很有趣,但不是真实的。

它出现了......反过来说:)

整个EOF ... EOF块在Python运行时内执行,因此退出它不会影响bash脚本。如果你想停止进一步的bash脚本进程,你需要收集退出状态并在Python执行后检查它,即:

#!/bin/bash

~/.conda/envs/my_env/bin/python <

import sys

sys.exit(0x01)  # use any exit code from 0-0xFF range, comment out for a clean exit

print("End of the Python script that will not execute without commenting out the above.")

EOF

exit_status=$?  # store the exit status for later use

# now lets check the exit status and see if python returned a non-zero exit status

if [ $exit_status -ne 0 ]; then

echo"Python exited with a non-zero exit status, abort!"

exit $exit_status  # exit the bash script with the same status

fi

# continue as usual...

echo"All is good, end of script"

这样就可以了。 万分感谢!:)

从shell脚本中您有2个选项:

set -e:所有错误退出脚本

检查python子命令返回代码,如果非零则中止

(这里可能有更多细节:如果任何命令返回非零值,则中止shell脚本?)

现在,如果您不想从shell脚本更改处理,则可以获取python脚本的父进程并将其终止:

except Exception as e:

import os,signal,sys

print("Exception: %s" % e)

os.kill(os.getppid(),signal.SIGTERM)

sys.exit(2)

如果你在Windows上需要这个,这不起作用(os.kill不存在),你必须调整它来调用taskkill:

subprocess.call(["taskkill","/F","/PID",str(os.getppid())])

现在我要说杀死父进程是不好的做法。除非您不控制此父进程的代码,否则应该尝试优雅地处理退出。

谢谢! 不os.kill取2个参数,另一个是sig吗?

是的,它确实!编辑。

谢谢,这就是我想要的。 更清洁,更好。 奇迹般有效。

我不会称之为更干净,但如果你有300个shell脚本,你可能不想全部修改它们,所以这是仅在python脚本中进行更改的解决方案。 这只有在shell BTW直接调用时才有效。

杀死整个脚本的一种方法是保存PID,然后使用Python的系统命令在异常发生时对PID执行kill命令。如果我们导入'os',它将是:

# In a shell

PID=$$

...

// Some Python Exception happens

os.system('kill -9' + $PID)

python运行脚本被杀死_从python异常中杀死Bash脚本相关推荐

  1. mac python运行按哪个键_#mac python如何使用教程#怎么在mac终端运行python程序

    mac如何投屏手机 1.首先,解iPhone,然后用手指从下往上,打开控心,在其中就可以找到AirPlay了屏幕镜像. 2.接来下就来教大家如何使用AirPlay吧,首先将手机和电脑连接在同一WiFi ...

  2. python运行程序的快捷键_在Python集成开发环境中,可使用快捷键()运行程序。...

    在Python集成开发环境中,可使用快捷键()运行程序. 更多相关问题 如何理解创新能力测试与创新能力的关系? 直埋线路与埋式电力电缆电压<35kv平行时最小间距为(). 放射性物品装卸作业时, ...

  3. python运行代码不成功_【Python】程序在运行失败时,一声不吭继续运行pass

    在前面程序出现异常时,我们都会给一个提示,告诉用户,程序为什么会异常,但是现在我们想在程序出现异常时,不做处理,让程序默默的往下执行,不要做声. 那么我们就引入了pass语句 defcount_wor ...

  4. python路径在哪里设置_找Python安装目录,设置环境路径以及在命令行运行python脚本实例...

    第一点:找Python安装目录 方法一: 方法二: 输入import sys print(sys.path) 化黑线处 第二点:找到安装目录后就可以开始设置环境变量 这里我的安装目录为C:\Progr ...

  5. python写手机脚本脱离电脑_让Python在Android系统上飞一会儿:第三节 在电脑上编写程序在手机上运行...

    本节目录 1. 一些传统的方法2. 将程序的代码生成二维码图片3. 使用手机扫描生成的二维码,并将其转化为py脚本 前言 最手机上写脚本是一件每场辛苦的事情,虽然SL4A人性化的为我们提供了API快速 ...

  6. 详解python运行三种方式_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  7. python运行界面如何缩小_如何使用Python调整图像大小

    作者|Nicholas Ballard 编译|VK 来源|Towards Data Science 可以说,每一个"使用计算机的人"都需要在某个时间点调整图像的大小.MacOS的预 ...

  8. 详解python运行三种方式_详解python运行三种方式

    方式一 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: $ p ...

  9. python perl 日本的应用_将Python,Perl,Ruby或Shell脚本转换为适用于Mac OS X的自包含应用程序 | MOS86...

    Platypus是一款非常出色的实用程序,可让您将任何脚本转换为独立的Mac OS X应用程序.免费且非常简单的使用,Platypus将支持任何shell脚本,Perl,Python,PHP,Ruby ...

最新文章

  1. hibernate脏数据_Hibernate性能提示:脏收集效果
  2. python size(0)_对x.view(x.size(0), -1)的一些理解
  3. leetcode 646 python
  4. PyTorch 1.0 中文文档:广播语义
  5. vSphere 6.5 Upgrade Considerations Part-2 (vSphere 6.5升级注意事项第2部分)
  6. cisco的路由器上rip的被动接口,单播更新,水平分隔
  7. 继承关系下怎样使用Builder 模式
  8. 俄罗斯方块游戏的算法
  9. linux的DRM应用程序,Linux中的DRM
  10. sel4 手册总结之介绍与内核服务和对象
  11. 回顾2017展望未来
  12. python保存文件名,line 257, in urlretrieve tfp = open(filename, ‘wb‘)OSError: [Errno 22] Invalid argument:
  13. 郑轻OJ:1153: 简易版最长序列
  14. 内核驱动隐藏自身【断链】
  15. 很多APP都支持了 “本机号码一键登录”,知道是怎么实现么?
  16. PIC16F877A单片机 (中断与定时器Timer1)
  17. 一个具有一些功能的网络画图板
  18. Rk3326 Android8.0HAL服务添加
  19. python发送短信验证码登录_python发送短信验证码
  20. 国内外php主流开源cms汇总(2010年1月) .

热门文章

  1. ViewTreeObserver的使用
  2. 思科华为厂家为什么要推出自己的CCIE/HCIE认证
  3. php 除法,php除法函数有哪些
  4. 重磅!12306最新消息,官方购票日历已发布,最新春运消息尽在文中
  5. 从C4D动态设计到导演,从学生奥斯卡到奔驰广告,新锐先锋艺术家田思聪的CG成长路
  6. 二话不说就解约,无法享受公司福利,合同工到底有多惨?
  7. RecycleView Item设置隐藏会空白占位解决方案
  8. 趣味三角——第12章——tanx
  9. java球球大作战_球球大作战(小游戏源码)
  10. 04 Java内存分析