首页 > 解决方案 > 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)

为什么?

标签: shellpython

解决方案


因为os.system不返回退出代码而是等待状态。要将其转换为您需要使用的返回代码os.waitstatus_to_exitcode(或os.WEXITSTATUS用于较旧的 Python 版本)。

In [2]: os.WEXITSTATUS(256)                                                                                                                                                                                       
Out[2]: 1

有关更多详细信息,请参阅os.waitstatus_to_exitcodeos.system的 python 文档。以及有关等待状态的更多详细信息man systemman waipid

此外,如果您需要一些更“用户友好”的方式从 Python 运行命令/程序,我建议使用subprocess 模块


推荐阅读