我正試圖捕捉這個命令的輸出:
ls -l /sys/class/net/e*/device/virtfn*。
在我的Python腳本中,使用了subprocess庫。
這個命令的輸出是:
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn0 -> 。 ./0000:01:10.0。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn1 -> 。 ./0000:01:10.2。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn2 -> 。 ./0000:01:10.4。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn3 -> 。 ./0000:01:10.6。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn4 -> 。 ./0000:01:11.0。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn5 -> 。 ./0000:01:11.2。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn6 -> 。 ./0000:01:11.4。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f0/device/virtfn7 -> 。 ./0000:01:11.6。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn0 -> 。 ./0000:01:10.1。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn1 -> 。 ./0000:01:10.3。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn2 -> 。 ./0000:01:10.5。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn3 -> 。 ./0000:01:10.7。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn4 -> 。 ./0000:01:11.1。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn5 -> 。 ./0000:01:11.3。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn6 -> 。 ./0000:01:11.5。
lrwxrwxrwx. 1 root root 0 Sep 7 14: 52 /sys/class/net/enp1s0f1/device/virtfn7 -> 。 ./0000:01:11.7。
我腳本中的代碼:
def getMacOfBusSlotFunction(self, slotbus, slotslot, slotfunction)。
myParentDevicesProcess = subprocess.Popen(['ls','-l','/sys/class/net/e*/device/virtfn*'] )
stdout , stderr = myParentDevicesProcess.communication()
print(stdout.decode("utf-8"/span>)
我使用檢索subprocess.call()的輸出作為基礎。
我添加了.decode("utf-8")部分,因為我想也許輸出被作為bytes回傳。包括它和不包括它仍然得到相同的結果......
我在運行這個程序中得到的實際輸出是一個空行()。
)。
我希望輸出是命令的實際輸出。
uj5u.com熱心網友回復:
你忘了告訴Popen來捕獲輸出/stderr;默認情況下,它只是讓它去終端。要解決這個問題,你只需要告訴它通過管道捕獲它們到父行程:
myParentDevicesProcess = subprocess. Popen(['ls','-l','/sys/class/net/e*/device/virtfn*'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
當然,這仍然不會起作用,因為glob擴展是shell的一個屬性,而不是ls命令,而且你并沒有通過shell運行你的命令(也不應該這樣)。你可以讓Python為你做glob擴展,使之與shell大致匹配(在檔案的頂部放上import glob):
myParentDevicesProcess = subprocess.Popen(['ls'/span>,'-l'/span>] glob. glob('/sys/class/net/e*/device/virtfn*'), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
uj5u.com熱心網友回復:
Popen(或任何subprocess呼叫),如果沒有shell=True,就不能使用像通配符擴展這樣的shell特性。 如果你也檢查了標準錯誤,你會發現一個錯誤資訊:ls找不到一個以字面意思命名的檔案 /sys/class/net/e*/device/virtfn。
瑣碎的修復方法是使用shell(并且可能切換回來以避免裸露的Popen)。
listing = subprocess.check_output('ls -l /sys/class/net/e*/device/virtfn', shell=True)
在某些方面,更好的解決方案是使用 Python 的本地函式來提取你需要的資訊,而不是試圖決議ls輸出,但是由于我們不知道你想要什么資訊,這就有點難以確定了。 如果你的最終目標是解決符號鏈接,請嘗試
import glob
import os
for symlink in glob.glob('/sys/class/net/e*/device/virtfn'):
print(os.readlink(symlink))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/309326.html
標籤:
上一篇:從vcenterpowershell向現有的csv輸出添加列
下一篇:Python2.7&SQLite3:使用DATE(SUBSTR())進行DELETE和SELECT操作。不起作用
