【问题标题】:xmlrpc - dynamically choosing port numberxmlrpc - 动态选择端口号
【发布时间】:2025-11-24 01:25:02
【问题描述】:

我有一个 python 程序,它启动另一个可执行文件作为子进程。反过来,子进程启动一个 XML-RPC 服务器,父进程作为客户端连接到该服务器。

我不想修复端口号,因为有时端口可能不可用,因为同一程序的另一个实例正在同一台机器上运行。

我可以让父进程选择端口号并将该信息作为参数或通过 Unix 环境变量传递。

但在最坏的情况下,端口号可能会在父进程检查然后子进程尝试获取时变得不可用。

我们可以让子进程先获取端口号,然后告诉父进程。子进程打印大量数据,这些数据被重定向到一个文件。有没有比解析标准输出更好的方法?类似于 Unix Env​​ 变量,但会修改调用者的环境。

另一种方法是让父进程拥有一个 xml-rpc 服务器并将地址传递给子进程。子进程会进行调用并告知其服务器地址。

有没有更好的办法?

【问题讨论】:

    标签: python xml-rpc


    【解决方案1】:

    不确定您的操作系统,如果是 ubuntu,那么您的父母可以通过使用子进程 ID 和 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
    

    子进程使用 0 端口,因此选择了一个空闲端口。然后打印出端口:

    #!/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_address
    #
    #
    

    参考:

    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

    【讨论】: