【问题标题】:python: output of os.system is not considered for a true/false check?python: os.system 的输出不考虑进行真/假检查?
【发布时间】:2013-06-03 06:01:50
【问题描述】:

所以我有这个来确定一个进程是否正在运行:

os.system("ps aux | grep [my]process")

我使用方括号,所以我也不会返回 grep 命令。

当我尝试做类似的事情时

'yes' if os.system("ps aux | grep [my]process") else 'no'

我总是不会,即使实际上 python 打印带有进程信息的行。

很确定我这边一定有某种误解...我假设如果 os.system 的输出不为零,则表达式解析为真,所以我应该得到“是”。但这根本不会发生,我不明白,即使进程正在运行,并且命令正确返回有关进程的信息。

我在这里做错了什么?

谢谢!

【问题讨论】:

    标签: python


    【解决方案1】:

    你的逻辑是错误的。当有一些匹配的行时,grep 正在返回 0

    无论如何,使用subprocess 模块是一个更好的主意。您可以获得ps aux 的输出并在您的程序中检查它。虽然解析 ps 的输出总是相当脆弱的

    例如:

    import subprocess
    'yes' if 'myprocess' in subprocess.check_output(['ps','aux']) else 'no'
    

    【讨论】:

    • 谢谢,我不知道 os.system 会返回退出状态(它会打印出命令输出,所以我的假设是它会基于此返回 true 或 false)。如果 ps aux 的输出很脆弱,你会建议检查我是否有一个进程正在运行?
    • @newbiez,不幸的是它是特定于平台的。 SO上已经有一些questionsstackoverflow.com/questions/2703640/…
    • 奇怪,我得到“attributeError: 'module object has mo attribute 'check_output'”。我做了导入子过程,但是当我尝试运行字符串时,我得到了这个错误。也许我有一个旧的 Python?我在 Mac Lion 上
    • 谜团解开了:你不能在 mac 上使用 check.output,因为新版本的 Python 不再使用它了。必须使用 subprocess.call
    • @newbiez,你用的是什么版本的 Python? subprocess.check_output 肯定不会被弃用。确保您有下划线,而不是您在评论中所做的点。
    【解决方案2】:

    os.system 的输出不是屏幕上打印的内容。

    在 Unix 上,返回值是进程的退出状态,编码为 为 wait() 指定的格式。请注意,POSIX 没有指定 C system() 函数的返回值的含义,所以返回 Python 函数的值取决于系统。

    在 Windows 上,返回值是系统 shell 返回的值 运行命令后,由 Windows 环境变量给出 COMSPEC:在 command.com 系统(Windows 95、98 和 ME)上,这始终是 0;在 cmd.exe 系统(Windows NT、2000 和 XP)上,这是出口 命令运行的状态;在使用非本地 shell 的系统上, 查阅你的 shell 文档。ù

    http://docs.python.org/2/library/os.html#os.system

    【讨论】:

    • 非常感谢!所以它只返回退出状态码;实际上我已经更改了 if 所以它检查 1 并且我得到“是”,而如果我拼错进程名称或检查 0 我实际上得到了“否”。
    • 对不起,我的意思是相反的;确实,代码 0 表示无错误退出。
    【解决方案3】:

    os.system 返回执行命令的退出状态。如果命令成功,则返回 0,否则返回非零数。示例:

    >>> t=os.system("ls")
    >>> t
    0
    >>> t=os.system("lsas")
    sh: 1: lsas: not found
    >>> t
    32512
    >>> 
    

    【讨论】:

      【解决方案4】:

      使用subprocess.call()subprocess.check_call()

      【讨论】:

        猜你喜欢
        • 2021-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 2017-04-26
        • 2021-04-20
        相关资源
        最近更新 更多