2017-04-12 58 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