【问题标题】:Get exit status code from Python, e.g. 0 or 1从 Python 获取退出状态代码,例如0 或 1
【发布时间】:2017-01-22 06:04:05
【问题描述】:

我有一个 Python 脚本,它将执行一些操作,并根据结果以代码 0(正常)或 1(不好)退出。

我想捕捉这个结果,将其存储到一个变量中并通过 UDP 发送。这不能在 Python 脚本中完成(要求)。

假设我的脚本是这样的:

import sys
# Do some stuff
sys.exit(0) # or sys.exit(1)

我使用python script.py 运行。

如何获取此退出状态代码(0 或 1)?

我尝试回显$errorlevel,但它只打印一个空行。我还尝试使用exit(0) 代替sys.exit()(参见here)和其他一些不成功的尝试。

【问题讨论】:

  • sys.exit(0) 是将返回码发送到 shell 的正确方法。但是您没有说您使用的是哪个操作系统或外壳。在 bash 和类似的 shell 中,$? 具有最后一个命令的退出代码。
  • “我用 python script.sh* 运行。”,你不是说“我用 python script.py 运行”吗?
  • 是的,对不起.py
  • 这真的是关于 Python 的问题吗?据我所知,您正在询问如何捕获进程的退出代码(在这种情况下是 Python) - 但它可以是任何进程。正如@PM2Ring 提到的 - 这取决于你的外壳/环境等......
  • 这不是 python 本身的问题。这是关于你的外壳的问题。你用哪一个?重击,嘘,鱼,...?在 bash 中,您使用 $? 捕获最后一个退出代码。您如何发送捕获的变量?

标签: shell exit


【解决方案1】:

这是一个脚本问题,而不是 Python 问题,但在 Bash shell 中您使用 $? 并且由于任何命令都会更改 $?,因此保存副本通常是个好主意。

python script.py
RC=$?

echo $RC
[ $RC == 0 ] && echo Success || echo Failed
# Replace above lines by whatever you need to send $RC via UDP ...

如果是 Windows CMD 脚本问题,您可能应该使用适当的标签重新发布。 (我不再做 Windows,谢谢。)

【讨论】:

  • 如果使用shell,则最后一行应更改为[ $RC==0 ] && ...
【解决方案2】:

因为根据您的回答,您使用的是zsh

test.py

import sys
sys.exit(12)

在您的控制台中

python test.py
RC=$?
echo "Exit code $RC"
program_to_send $RC

【讨论】:

  • 我不太明白第 2 行和第 3 行的想法 - 为什么不直接回显 $?直接?
  • @Jakob echo 将设置它自己的退出代码,第二个调用将使用它而不是原始代码。因此,为了使两者保持一致,我存储退货并在两个地方使用它。
  • 当我这样做时(没有 RC=$?),它返回正确的值 - 如果一切正常,则返回 0,但是当我在 .py 文件中强制出错时,它返回 1跨度>
  • @Jakob 请发布一个新问题,以便我们在那里进行适当的讨论。
【解决方案3】:

这应该通过捕获异常和使用记录器以正确的方式完成。

import logging, time

logging.basicConfig(level=logging.DEBUG, filename='/path/to/file/errorlog.log')

try:
    #MySQL Connection
except MySQLdb.Error as e:
    errortime = time.strftime('%Y-%m-%dT%H:%M:%S')
    logging.exception(errortime)
    raise os._exit(0)

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多