Linux命令行调用没有从os.system返回它应该的内容?

时间:2010-09-24 22:26:27

标签: python linux python-2.7 command-line os.system

我需要对linux进行一些命令行调用并从中获取返回,但是如下所示只返回0它应该返回时间值,如00:08:19,我是在常规命令行中测试完全相同的调用,它返回时间值00:08:19,所以我很困惑我做错了什么,因为我认为这是如何在python中进行的。

import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue

10 个答案:

答案 0 :(得分:99)

返回的是执行此命令的返回值。您在直接执行它时看到的是stdout中命令的输出。返回0意味着执行中没有错误。

使用popen等捕获输出。

沿着这条线的一些事情:

import subprocess as sub
p = sub.Popen(['your command', 'arg1', 'arg2', ...],stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

import os
p = os.popen('command',"r")
while 1:
    line = p.readline()
    if not line: break
    print line

ON SO:Popen and python

答案 1 :(得分:25)

如果您只对流程的输出感兴趣,最简单的方法是使用子流程'check_output函数:


output = subprocess.check_output(["command", "arg1", "arg2"]);

然后输出将程序输出保存到stdout。请查看上面的链接以获取更多信息。

答案 2 :(得分:10)

最简单的方法是:

import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue

这将作为列表

返回

答案 3 :(得分:8)

如果传递的命令执行成功,则代码返回0,如果失败则返回非零。以下程序适用于python2.7,避免检查3和以上版本。试试这段代码。

>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret

答案 4 :(得分:2)

是的,这是违反直觉的,并不是非常pythonic,但它实际上只是模仿unix API设计,其中这些calld是C POSIX函数。查看man 3 popen&& man 3 system

用于替换我使用的 os.system 的更方便的代码段:

from subprocess import (PIPE, Popen)


def invoke(command):
    '''
    Invoke command as a new system process and return its output.
    '''
    return Popen(command, stdout=PIPE, shell=True).stdout.read()


result = invoke('echo Hi, bash!')
# Result contains standard output (as you expected it in the first place).

答案 5 :(得分:2)

我无法在 IonicBurger 中添加评论,因为我没有" 50声誉"所以 我将添加一个新条目。我很抱歉。 os.popen()对于多个/复杂命令(我的意见)是最好的,除了获取stdout以及下面更复杂的多个命令之外还获取返回值:

import os
out = [ i.strip() for i in os.popen(r"ls *.py | grep -i '.*file' 2>/dev/null; echo $? ").readlines()]
print "     stdout: ", out[:-1]
print "returnValue: ", out[-1]

这将列出名称中任何位置带有' file' 一词的所有python文件。 [...] 是一个列表解析,用于从每个条目中删除(剥离)换行符。 echo $?是一个shell命令,用于显示最后执行的命令的返回状态,该命令将是grep命令,在本例中是列表的最后一项。 2> / dev / null 表示将 grep 命令的 stderr 打印到 / dev / null ,它没有出现在输出中。 ' 命令之前的' 是使用原始字符串,因此shell不会解释像' *' 错误。这适用于python 2.7。以下是示例输出:

      stdout:  ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py']
 returnValue:  0

答案 6 :(得分:1)

这是一个旧线程,但纯粹使用os.system,以下是访问ps调用返回的数据的有效方法。注意:它确实使用管道将数据写入磁盘上的文件。 并且 OP没有特别要求使用os.system的解决方案。

>>> os.system("ps > ~/Documents/ps.txt")
0    #system call is processed.
>>> os.system("cat ~/Documents/ps.txt")
  PID TTY          TIME CMD
 9927 pts/0    00:00:00 bash
10063 pts/0    00:00:00 python
12654 pts/0    00:00:00 sh
12655 pts/0    00:00:00 ps
0

相应地,

>>> os.system("ps -p 10063 -o time --no-headers > ~/Documents/ps.txt")
0
>>> os.system("cat ~/Documents/ps.txt")
00:00:00
0

不知道为什么他们都归零了。

答案 7 :(得分:1)

根据您的要求,子进程python模块的Popen函数就是答案。例如,

import subprocess
..
process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print stdout

答案 8 :(得分:0)

我相信这是最快的方式

import os
print(os.popen('command').readline())
x = _
print(x)

答案 9 :(得分:-1)

using commands module
import commands
""" 
Get high load process details 
"""
result = commands.getoutput("ps aux | sort -nrk 3,3 | head -n 1")
print result  -- python 2x
print (result) -- python 3x