作者os653 (allstar)
看板Python
標題[問題] subprocess.Popen 和 IPC 衝突?
時間Wed Feb 29 20:22:50 2012
需要讓 A 和 B 兩個程式用 socket 交談,如果讓 A 和 B 分開執行沒問題
但讓 A 以 subprocess.Popen 執行 B 時,只能同時執行一次
如果在前一個 A 和 B 還存在時再執行第二次
會出現
socket.error: [Errno 10048] 一次只能用一個通訊端位址
請問這該如何解決?
照理說有把 listen 的 socket 關掉,且分開執行沒問題
用 subprocess.Popen 執行也不應該會有問題才對阿
code 如下
========== server.py ==========
import socket
address = ('127.0.0.1', 12345)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(address)
import subprocess # 注解掉這兩行即可分開執行
subprocess.Popen('client.py', shell=True) # 且分開執行多次也不會出問題
s.listen(0)
conn, addr = s.accept()
s.close()
raw_input('server connected by %s\n' % repr(addr))
#========= client.py ==========
import socket
address = ('127.0.0.1', 12345)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(address)
raw_input('client connected\n')
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.46.124.87
→ KSJ:你的client再等你給他raw_input的結果...所以還沒關掉吧? 03/01 00:45
→ os653:本來就沒打算要關掉阿XD,後來把close_fd設成True就搞定了 03/01 13:59
→ os653:實在搞不清楚child process怎麼運作的... 03/01 14:00
→ os653:題外話,subprocess不吃unicode,有夠麻煩 03/01 14:01
→ KSJ:對厚 我傻了 0.0 03/01 14:36
→ KSJ:不過我去查了close 似乎不是立刻殺掉socket 03/01 15:29
→ KSJ:不過 我用shutdown 他跟我說沒連接 0.0 03/01 15:31
→ KSJ:另外我覺得bytestring能吃中文也ok啦 像shelve也不吃unicode 03/01 15:36
→ os653:問題就在不是中文的部分阿,subprocess似乎會強制轉換成 03/01 16:32
→ os653:filesystem的encoding,在windows上就是用mbcs下去轉 03/01 16:33
→ os653:遇到簡體或日文檔名會轉換出?代替轉不出來的字元 03/01 16:34
→ os653:然後就找不到檔案而無法執行了... 03/01 16:34
→ os653:加上有裝unicode補完計畫就更混亂,還得去pypi找替代品 03/01 16:36
→ KSJ:囧 考慮得好詳細啊 這我就沒研究了… 目前改檔名是唯一解嗎? 03/01 20:14