Python - os.system 在输出末尾添加了不必要的换行和0

5 投票
4 回答
4309 浏览
提问于 2025-04-17 16:19

我不知道为什么会这样,当我尝试去掉多余的部分时,它却报错了。

>>> 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

有没有人知道我该怎么做才能避免这个问题,或者怎么去掉它而不出现错误?谢谢!

4 个回答

2

os.system 这个命令不会返回标准输出的内容。如果你想获取这些内容,可以使用 os.popen("uptime").read()

3

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
6

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 的文档

撰写回答