shell - Python 脚本通过 os.system() 退出代码 256 而不是 1 调用 shell 脚本。为什么?
问题描述
我正在编写一个 Python 脚本来处理不同 shell 脚本的退出代码。
当我通过命令提示符调用 shell 脚本并使用 询问退出代码时echo $?
,我得到一个 1。当我通过 python 脚本调用 shell 脚本时,我假设该值为1
,但结果却是 256。
发生了什么?
这是我用于测试相机的 shell 脚本:
#!/bin/bash
#cam.sh
if [ -r /dev/video0 ]
then
#taking a picture
ffmpeg -f video4linux2 -s 640x480 -i /dev/dev0 -ss 0:0:2 -frames 1 ~/Desktop/testbild.jpg 2>/dev/null
#showing a stream
timeout 10s vlc v4l2:///dev/video0 --no-audio --no-video-title-show
exit 0
else
exit 1
fi
我的 Python 调用:
#!/usr/bin/env python
#exitcodetest.py
import os
command = "sh ~/Desktop/cam.sh"
camera = os.system(command)
print(camera)
为什么?
解决方案
因为os.system
不返回退出代码而是等待状态。要将其转换为您需要使用的返回代码os.waitstatus_to_exitcode
(或os.WEXITSTATUS
用于较旧的 Python 版本)。
In [2]: os.WEXITSTATUS(256)
Out[2]: 1
有关更多详细信息,请参阅os.waitstatus_to_exitcode和os.system的 python 文档。以及有关等待状态的更多详细信息man system
。man waipid
此外,如果您需要一些更“用户友好”的方式从 Python 运行命令/程序,我建议使用subprocess 模块。
推荐阅读
- javascript - 如何在 react-native 中动态加载模块?
- c# - c# 访问List中的类方法
- >
- typescript - 如何在 Typescript 中使用 Cytoscape.js 的 UI 扩展?
- cordova - Ionic CodePush 失败:没有这样的文件或目录,lstat './platforms/android/assets/www/'
- android - 防止在按 KEYCODE_VOICE_ASSIST 时在 Google Pixel 中弹出 Google Assistant
- arrays - Bash 我不能打印数组的所有元素,只能打印最后一个
- c# - HTML 中的更改未反映在浏览器中
- cryptography - 恒定输入如何影响问题的 SAT 公式?
- php - 滚模程序 php
- xslt - XSLT 将属性从节点转换为另一个节点的元素并将它们从源节点中删除