看板 Python 關於我們 聯絡資訊
需要讓 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