【问题标题】:Python - os.system is placing an unwanted (and unnecessary) newline and a 0 at the end of outputPython - os.system 在输出末尾放置一个不需要(和不必要的)换行符和 0
【发布时间】:2025-12-06 00:15:02
【问题描述】:

我不知道它为什么会这样,当我尝试修剪它时,它会吐出一个错误。

>>> print os.system('uptime')
21:05  up  9:40, 2 users, load averages: 0.69 0.76 0.82
0
>>> print os.system('uptime')[:-2]
21:07  up  9:42, 2 users, load averages: 0.75 0.74 0.80
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not subscriptable

有谁知道我可以如何阻止这种情况发生或如何在没有错误的情况下将其删除?谢谢!

【问题讨论】:

    标签: python os.system


    【解决方案1】:

    os.system 没有做任何这样的事情;发生的事情是 uptime 本身正在写入标准输出(真正的标准输出,而不是 Python 的 sys.stdout),而 os.system 正在返回 uptime 的返回值,即 0(表示它已成功退出)。

    如果您想在 Python 中访问字符串 uptime 打印到标准输出,则必须使用其他方式调用它,例如 subprocess.Popen

    >>> import subprocess
    >>> uptime = subprocess.Popen('uptime', stdout=subprocess.PIPE)
    >>> output = uptime.stdout.read()
    >>> output
    ' 04:20:09 up 12:13,  5 users,  load average: 0.99, 1.15, 1.25\n'
    

    有关详细信息,请参阅subprocess documentation

    【讨论】:

      【解决方案2】:

      os.system() 首先在子shell 中执行命令。该子shell 打印您看到的第一行。

      在 Unix 上,返回值是进程的退出状态。那就是您在解释器中看到的0。您可以通过将其分配给变量来抑制它:

      >>> x = os.system('uptime')
      14:12  up 21:45, 4 users, load averages: 1.13 0.93 0.82
      >>> 
      

      或者,使用subprocess.call():

      >>> import subprocess
      >>> status = subprocess.call('uptime')
      14:19  up 21:52, 4 users, load averages: 1.12 0.93 0.86
      >>> print status
      0
      

      也许您宁愿在变量中同时捕获输出和返回的状态,以便在显示(或不显示)之前对它们进行操作:

      >>> pipe = subprocess.Popen(['uptime'], stdout=subprocess.PIPE, shell=True)
      >>> 
      >>> for line in pipe.stdout:
      ...     print line
      ... 
      14:36  up 22:10, 4 users, load averages: 0.59 0.59 0.65
      
      >>> status = pipe.wait()
      >>> 
      >>> print status
      0
      

      【讨论】:

        【解决方案3】:

        os.system 不返回标准输出的内容。如果你想捕捉那些使用os.popen("uptime").read()

        【讨论】:

        • 虽然可行,但应注意 os.popen 自 Python 2.6 以来一直是 deprecated
        【解决方案4】:

        您不必打印输出。

        os.system 调用的实际命令打印到标准输出,函数 os.system() 以整数形式返回命令。

        所以试试

        os.system('uptime')
        

        【讨论】: