我有一个在其中调用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. 如何在MySQL中为多个列指定唯一约束?
  2. MySQL性能调优 读写分离
  3. Google 首次引入数据中心液体冷却
  4. 【CF#2A】Winner(模拟 STL-map)☆
  5. _GUN_SOURCE宏
  6. Java CompletableFuture
  7. 吴恩达|机器学习作业2.1正则化的Logistic回归
  8. 开课吧:Web开发要学习哪些基础知识?
  9. 任务方案思考:句子相似度和匹配
  10. 「leetcode」39. 组合总和【回溯算法】详解!
  11. vscode代码对比差异视图窗口切换方法(左右文件位置切换)
  12. excel学习-sumifs函数(单条件求和+多条件求和+模糊条件求和)
  13. 命令行下获取公网IP地址汇总
  14. 前端获取北京时间_分享js获取标准北京时间的代码 JS如何获取北京时间JS
  15. 华为 eNSP 模拟器配置动态路由(ospf)
  16. 一个很精致的HelloWorld,你看得懂么?
  17. 将Android 根目录挂载为 可读可写RW
  18. 2021 AAAI Fellow名单重磅出炉!华人学者遗憾连续两年无缘入选
  19. RL(Chapter 5): Blackjack (二十一点)
  20. python爬取豆瓣排行榜电影(静态爬取)(二次爬取)

热门文章

  1. 抽屉有源电力滤波器谐波治理
  2. JavaFx出现错误Caused by: java.lang.NullPointerException: Location is required的解决方法
  3. 宁夏建筑安全员A证怎么考多选题库
  4. 北大程设 魔兽终极版总结
  5. ps神经网络滤镜不能下载,ps神经网络滤镜用不了
  6. 想把会议录音转成文字,有哪些语音转文字方法?
  7. QQ群文件无法显示,空白,加载不出来
  8. 微信小程序基础之在微信上显示和体验小程序?
  9. 开关灯问题(python)实现
  10. Java常见异常类型及原因分析