【问题标题】:What is the return value of os.system() in Python?Python 中 os.system() 的返回值是什么?
【发布时间】:2011-09-21 22:37:14
【问题描述】:

我遇到了这个:

>>> import os
>>> os.system('ls')
file.txt README
0

os.system() 的返回值是多少?为什么我得到 0?

【问题讨论】:

  • os.system("ls") 用于运行您只关心它是否运行的命令。如果您想要标准输出输出,请使用此处定义的 commands.getstatusoutput("ls")[1] 之类的内容:docs.python.org/2/library/commands.html
  • (但是,如果您不采取其他措施,os.system("ls") 将输出ls 的结果。在这种情况下,我不确定您是否想要抑制附加输出,但如果你这样做了,一种方法是os.system("ls > /dev/null 2>&1")
  • 只是为了说明这一点,os.system 的文档非常明确地建议您避免使用它,而使用 subprocess。有一个函数只运行一个命令并返回其结果代码 (subprocess.call) 和一个从命令中检索输出 (subprocess.check_output) 以及一个在命令失败时失败的函数 (subprocess.check_call)。有一个现代的高级函数 subprocess.run 可以完成这三个功能,甚至更多。

标签: python operating-system


【解决方案1】:

"在Unix上,返回值是出口 编码在进程中的状态 为 wait() 指定的格式。注意 POSIX 没有具体说明 C system() 的返回值 函数,所以返回值 Python 函数依赖于系统。”

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

没有错误,所以退出码为零

【讨论】:

【解决方案2】:

os.system 的返回值取决于操作系统。

在 Unix 上,返回值是一个 16 位数字,其中包含两条不同的信息。来自文档:

一个16位的数字,低字节是杀死进程的信号号,高字节是退出状态(如果信号号为零)

因此,如果信号编号(低字节)为 0,理论上将结果移动 8 位(result >> 8)以获取错误代码是安全的。函数os.WEXITSTATUS 正是这样做的。如果错误码为0,则通常表示进程无错误退出。

在 Windows 上,文档指定 os.system 的返回值取决于 shell。如果shell为cmd.exe(默认),则值为进程的返回码。同样,0 表示没有错误。

对于其他错误代码:

【讨论】:

  • OS 维护一个 errno 作为变量,该变量具有最近执行的进程的退出状态。 erron是全局的,这个errno值在执行后返回,说明cmd执行成功还是失败
  • 这不是答案,Linux 链接现在没有任何用处。
  • @SteveBennett 谢谢,我修复了链接。为什么你认为它不符合作为答案的条件?问题是“这个数字是多少”,我给出了答案。
  • @brandones 感谢您指出这一点。这个答案是很久以前写的,显然缺少重要信息。现在应该是正确的。
  • 固体。很抱歉语气,我刚刚花了一段时间来解决这样的错误。请注意,您可以使用os.WEXITSTATUS(os.system(command)) 获取退出状态。
【解决方案3】:

os.system() 返回一些 unix 输出,而不是命令输出。所以,如果没有错误则退出代码写为0。

【讨论】:

    【解决方案4】:

    os.system('command') 返回一个 16 位的数字,左起 8 位(lsb)表示 os 用于关闭命令的信号,后 8 位表示命令的返回码。

    00000000    00000000
    exit code   signal num
    

    示例 1 - 代码为 1 的命令退出

    os.system('command') #it returns 256
    256 in 16 bits -  00000001 00000000
    Exit code is 00000001 which means 1
    

    示例 2 - 代码为 3 的命令退出

    os.system('command') # it returns 768
    768 in 16 bits  - 00000011 00000000
    Exit code is 00000011 which means 3
    

    现在尝试使用信号 - 示例 3 - 编写一个长时间休眠的程序,将其用作 os.system() 中的命令,然后通过 kill -15 或 kill -9 杀死它

    os.system('command') #it returns signal num by which it is killed
    15 in bits - 00000000 00001111
    Signal num is 00001111 which means 15
    

    您可以将 python 程序设置为 command = 'python command.py'

    import sys
    sys.exit(n)  # here n would be exit code
    

    如果是 c 或 c++ 程序,您可以使用 main() 的 return 或任何函数的 exit(n) #

    注意 - 这适用于 unix

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

    os.wait()

    等待子进程完成,并返回一个包含其 pid 和退出状态指示的元组:一个 16 位数字,其 低字节是杀死进程的信号号,其高 byte 是退出状态(如果信号编号为零);高位 如果生成了核心文件,则设置低字节。

    Availability: Unix
    

    .

    【讨论】:

    • 你能发布任何说明这一点的文档或链接吗?
    • @shane 我的答案适用于 unix,我不确定在 windows 上,我在下面提到了 - docs.python.org/2/library/os.html#os.system,它说它的返回将根据系统调用 wait(),然后我提到- docs.python.org/2/library/os.html#os.wait
    • 注意:您可以使用os.WEXITSTATUS(os.system(my_call)) 获取返回码。因此,例如sys.exit(os.WEXITSTATUS(os.system('exit 2'))) 将以状态码 2 退出。
    【解决方案5】:

    你可能想使用

    return_value = os.popen('ls').read()
    

    相反。 os.system 只返回错误值。

    os.popensubprocess.Popen 函数的更简洁的包装器,如 Python 源代码所示。

    【讨论】:

    • 对于os.system 文档中明确说明的指导的另一种疯狂替代方法:改用subprocess
    • @triplee 我认为如果你查看实际 python 代码 (github.com/python/cpython/blob/master/Lib/os.py) 中的 os.popen 函数,你会发现它无论如何都使用 subprocess.Popen。
    【解决方案6】:

    如果你想在命令提示符下存储运行命令的输出 os.system("")

    这是一种将输出存储在变量output中的替代方法

    # code to execute a command and store it's output in a variable
    
    import subprocess as sp
    output = sp.getoutput("whoami")
    print(output)
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 2020-05-14
      • 2016-10-18
      • 2014-11-18
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      相关资源
      最近更新 更多