2013-02-19 120 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

雖然有效,但應該注意自Python 2.6以來'os.popen'已被[棄用](http://docs.python.org/2/library/os.html#os.popen)。 – Cairnarvon 2013-02-19 03:45:30

0

你不應該打印輸出。

os.system調用的實際命令打印到stdout,函數os.system()以整數形式返回命令的返回值。

所以儘量

os.system('uptime') 
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 
5

os.system沒有做任何這樣的事情;發生了什麼是uptime本身寫入標準輸出(實際標準輸出,不是Python的sys.stdout),並且os.system返回uptime的返回值,即0(表示它已成功退出)。

如果你想訪問字符串uptime打印到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