2013-02-19 1 views
1

Я не знаю, почему это делается, и когда я пытаюсь обрезать его, он выплевывает ошибку.Python - os.system помещает ненужную (и ненужную) новую строку и 0 в конце вывода

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

Кто-нибудь знает, как я могу остановить это или как его удалить без ошибок? Благодаря!

ответ

1

os.system не возвращает содержимое стандартного вывода. если вы хотите их использовать os.popen("uptime").read()

+1

В то время как это работает, следует отметить, что 'os.popen' был [устарел] (http://docs.python.org/2/library/os.html#os.popen) с Python 2.6. – Cairnarvon

0

Вам не нужно печатать выходные данные.

Фактическая команда, вызываемая os.system, печатает в stdout, а функция os.system() возвращает возврат команды в виде целого числа.

Так что попробуйте

os.system('uptime') 
3

os.system() первым выполняет команду в субоболочке. Эта подоболочка печатает первую строку, которую вы видите.

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

os.system не делает ничего подобного; происходит то, что uptime сам пишет в stdout (real stdout, а не Python sys.stdout), а os.system возвращает возвращаемое значение uptime, что равно 0 (это означает, что он успешно завершен).

Если вы хотите получить доступ к строке uptime отпечатков в stdout в Python, вам придется использовать другой способ вызова, например 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 для более подробной информации.