我想通過stdout將一個執行的命令與subprocess.Popen()一起記錄到UDP套接字。我在網上看到過嘗試,但至少在我的情況下沒有真正的成功。如何從subprocess.Popen調用stdout.write?
有些人試圖對套接字進行子類化並將其傳遞給Popen的「stdout」參數,以覆蓋通過套接字發送的默認.write方法。 http://www.dreamincode.net/forums/topic/209734-using-a-socket-as-stdinstdout/
我也嘗試繼承「文件」類並覆蓋寫入方法與我的實現,但Popen似乎並沒有調用任何寫入方法。
事實上,這個子類化的想法不能用於Popen(args,stdout = mysocket)不調用任何mysocket.write(或任何.write)方法的簡單原因。爲了測試這個,我在調試模式下調用了Popen,並試圖從其init到最後沒有找到任何.write或類似的東西。我正在使用python 2.7
當然我知道我可以發送stdout到PIPE然後讀取它,但是這需要在我的情況下創建(多於一個)工作線程來讀取PIPE併發送,並且如果可能的話我想避免這個解決方案,如果更簡單的一個可用較低的努力。
我的文件子
class Foo(file):
dbgIP = ""
dbgPORT = 0
sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
def __init__(self, dbgIP, dbgPORT):
file.__init__(self,"empty",'w')
self.sck.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
self.dbgIP = dbgIP
self.dbgPORT = dbgPORT
def write(self, text):
return self.sck.sendto(text, (self.dbgIP, self.dbgPORT))
的示例調用
foofile = Foo(MCAST_GROUP,MCAST_PORT)
subprocess.Popen("jackd -R -P62 -dalsa -dhw:0 -p256 -n2 -i2 -o2 -s -S -r22050",shell=True, stdout=foofile, stderr=subprocess.STDOUT)
調用foofile.write("asd")
優良工程
您是否試圖在'Foo.write'中插入print語句來確保它不被調用? –
是的,雙重檢查,類是正確實例化(在構造函數的末尾用打印檢查),套接字工作(如果調用'foofile.write(「asd」)',但寫入永遠不會被Popen調用並因此沒有控制檯打印出現,因爲你建議) –
是否Popen實現更改及時?我正在運行Python 2.7.5 + –