2017-04-12 52 views
0

我有一個啓動另一個可執行文件作爲子進程的python程序。子進程反過來啓動父進程作爲客戶端連接到的XML-RPC服務器。xmlrpc - 動態選擇端口號

我不想修復端口號,因爲有時端口可能不可用,因爲在同一臺機器上運行同一程序的另一個實例。

我可以將它留給父進程來選擇端口號並將該信息作爲參數或通過Unix環境變量傳遞。

但是在最糟糕的情況下,端口號有可能從父檢查時間開始變爲不可用,然後子進程嘗試獲取。

我們可以讓子進程首先獲取端口號,然後告訴它的父。子進程打印大量的數據,這些數據被重定向到一個文件。有沒有比解析stdout更好的方法?像Unix環境變量,但修改調用者的環境。

另一種方法是父級擁有一個xml-rpc服務器並將該地址傳遞給子過程。子程序會打電話並通知它的服務器地址是什麼。

有沒有更好的方法?

回答

1

不確定你的操作系統,如果它是ubuntu,那麼你的父母可以通過使用child processid和netstat來找到端口。

netstat -antlp | grep processid 

另一種方式通過讀從子流程標準輸出:

#parent 
import subprocess 

proc=subprocess.Popen(['./test_python_xmlrpc_server.py'], stdout=subprocess.PIPE,close_fds=True) 

line = proc.stdout.readline() 
print line 

和子進程:

#!/usr/bin/python  
#./test_python_xmlrpc_server.py 
from SimpleXMLRPCServer import SimpleXMLRPCServer 

server = SimpleXMLRPCServer(("0.0.0.0", 0)) #pick a free port 
print server.server_addres 
# 
# 

REF:

How to kill a process on a port on ubuntu

Stop reading process output in Python without hang?

xmlrpc getting auto-assigned server port number