2011-04-21 76 views
4

我想在python中編寫一段代碼,它將從頂部獲取一些信息並將其放入一個文件中。 我想只寫應用程序的名稱並生成文件。我遇到的問題是我無法得到pidof命令的輸出,所以我可以在python中使用它。我的代碼如下所示:以bash命令的結果並在python中使用它

import os 

a = input('Name of the application') 
val=os.system('pidof ' + str(a)) 
os.system('top -d 30 | grep' + str(val) + '> test.txt') 
os.system('awk '{print $10, $11}' test.txt > test2.txt') 

問題是val總是有0但命令返回我想要的pid。任何輸入都會很棒。

+0

你有應用程序的名稱,你想...什麼?把關於這個應用程序的東西寫入文件? – eumiro 2011-04-21 13:56:46

回答

8

首先,不鼓勵使用input(),因爲它期望用戶鍵入有效的Python表達式。使用raw_input()代替:

app = raw_input('Name of the application: ') 

接下來,從system('pidof')返回值是不是PID,它是從pidof命令的退出代碼,即零成功,失敗不爲零。您想要capture the outputpidof

import subprocess 

# Python 2.7 only 
pid = int(subprocess.check_output(['pidof', app])) 

# Python 2.4+ 
pid = int(subprocess.Popen(['pidof', app], stdout=subprocess.PIPE).communicate()[0]) 

# Older (deprecated) 
pid = int(os.popen('pidof ' + app).read()) 

下一行缺少grep後面輸入一個空格,並會導致像grep1234的命令。使用字符串格式化操作%將使這更容易一點點辨認:

os.system('top -d 30 | grep %d > test.txt' % (pid)) 

第三行被嚴重引用,應該引起語法錯誤。注意單引號內的單引號。

os.system("awk '{print $10, $11}' test.txt > test2.txt") 
+0

這是你想要的答案。如果你願意,你可以將它抽象成一個函數。但是請注意,您可能需要調用.strip()來刪除輸出上的換行符:.communicate()[0] .strip() - 在這種情況下不需要,因爲int('12 \ n ')== 12 – ninjagecko 2011-04-21 14:19:59

+0

感謝您現在使用它的解決方案。你幫助我很多,並再次感謝你的快速響應。我使用python3和raw_input它不被支持,或者我不知道是否有一個新的表單。 – 2011-04-21 14:26:24

+0

raw_input的python3中的等價物被輸入,沒有相當於2.X的輸入 – 2011-04-21 14:29:47