8

我有一个 Python 脚本,应该报告上一个命令的成功或失败。目前,我正在做

command && myscript "Success" || myscript "Failed"

我想做的是能够运行未链接的命令,如下所示:

command; myscript

并且有myscriptretrieve $?,即存在状态。我知道我可以运行:

command; myscript $?

但我真正在寻找的是一种从 Python 中检索的 Python 方法$?

我该怎么做?


由于这是一个奇怪的要求,让我澄清一下它的来源。我有一个 Python 脚本,它使用pushover API 向我的手机发送通知。

当我运行一个长进程时,我将它作为process && notify "success" || notify "failure". 但有时我忘记这样做,只是运行该过程。此时,我想在仍在处理的命令行上运行“通知”,让它获取退出状态并通知我。

当然,我也可以在 bash 中实现 pushover API 调用,但现在它变成了如何在 Python 中实现它的问题。

4

4 回答 4

3

这可能是不可能的,因为脚本(任何语言,而不仅仅是 Python)是如何执行的。试试这个:创建一个调用retcode.sh以下内容的 shell 脚本:

#!/bin/bash
echo $?

使其可执行,然后在 shell 提示符下尝试以下操作:

foo # Or any other non-existent command
echo $?  # prints 127
foo
./retcode.sh  # prints 0

我必须仔细检查这一点,但似乎所有脚本,而不仅仅是 Python 脚本,都在一个单独的进程中运行,该进程无法访问由“父”shell 进程运行的上一个命令的退出代码. 这可以解释为什么 Python 没有(据我所知)给你一种方法来检索前一个命令的退出代码,比如 bash 的$?——因为无论如何它总是 0。

我相信你的做法command; myscript $?是实现你想要做的最好的方法:让 Python 脚本知道上一步的退出代码。

更新:在看到您对您正在尝试做的事情的澄清之后,我认为您最好的选择notify是稍微修改您的脚本,以便它可以采用类似-s--status(当然,使用argparse使解析选项更容易)的选项) 并根据状态码发送消息(如果代码为 0,则为“成功”,如果是其他任何值,则为“失败 NN”,其中 NN 是实际代码)。然后,当您在command没有小&& notify "success" || notify "failure"技巧的情况下键入时,当它仍在运行时,您可以键入notify -s $?并获取您正在寻找的通知,因为这将是您的 shell 在command返回后运行的下一件事。

于 2014-10-29T10:00:43.513 回答
3
false; export ret=$?; ./myscript2.py

myscript2.py:

#!/usr/bin/python

import os
print os.environ['ret']

输出:

1
于 2014-10-29T10:21:06.480 回答
1

但我真正在寻找的是一种 Python 方法来检索 $?来自 Python。

如果您将它们作为单独的进程运行,那么这显然是不可能的。

一个独立的进程无法知道另一个进程是如何结束的。

您可以 1) 将结果存储在文件中,2) 从 发出一些东西command,并将其通过管道传输到脚本 3) 从 运行命令myscript,依此类推……但您需要某种通信

最简单的方法当然是command; myscript $?

于 2014-10-29T10:01:44.613 回答
1

这显然是不可能的:进程的退出值只能由其父进程访问,而且我所知道的任何 shell 都没有提供 API 来允许下一个进程检索它。

恕我直言,更接近您的需求的是:

process
myscript $?

这样,即使您在不考虑通知的情况下开始处理,您也可以做到这一点。

您还可以使脚本能够运行进程获取退出代码及其通知,或者(取决于命令行中给出的选项)使用作为参数给出的退出代码。例如,您可以:

  • myscript process:运行process并发出通知
  • myscript -c $?: 只做通知

argparse模块可以使这变得容易。

于 2014-10-29T10:26:43.777 回答