如何通过Python的subprocess同时运行同一EXE文件两次并指定不同服务地址进行API通信
解决同一EXE多实例API通信的端口冲突问题
嘿,我来帮你搞定这个问题~ 你现在碰到的核心问题是默认端口冲突——你的App.exe启动REST服务时默认绑定了5000端口,两个实例都试图用同一个端口,要么导致第二个实例启动失败,要么你误以为它在运行但实际没正常提供服务(毕竟端口已经被第一个实例占了)。
下面是具体的解决步骤:
1. 先检查EXE是否支持自定义启动端口
绝大多数带REST服务的程序都会提供自定义端口的启动参数,你可以先试试查看程序的帮助文档:
App.exe --help
或者
App.exe -h
看看输出里有没有类似--port、--rest-port、--server-port这类参数。如果有的话,问题就简单了——给每个实例分配不同的端口就行。
2. 修改代码启动多实例并指定端口
假设程序支持--port参数,你可以这样调整代码:
import subprocess import requests import time # 用来等待服务完成启动 # 启动第一个实例,用默认端口5000,加载designI command1 = "App.exe --restserver" subprocess.Popen(command1) # 给服务留一点启动时间,避免提前发送请求导致失败 time.sleep(2) server_address1 = "127.0.0.1:5000" end_point = "/load/" params_designI = {"type": "designI"} url1 = f"http://{server_address1}{end_point}" response_designI = requests.post(url1, params_designI) # 启动第二个实例,指定端口5001,加载designII command2 = "App.exe --restserver --port 5001" subprocess.Popen(command2) time.sleep(2) server_address2 = "127.0.0.1:5001" params_designII = {"type": "designII"} url2 = f"http://{server_address2}{end_point}" response_designII = requests.post(url2, params_designII)
3. 如果EXE不支持自定义端口怎么办?
如果查看帮助后发现程序没有端口参数,你可以试试这两个方向:
- 检查程序是否有配置文件(比如
config.ini、settings.json这类),里面可能有端口设置项,修改后复制一份配置文件到不同目录,再启动第二个实例(避免两个实例共用同一个配置); - 如果是你自己开发的EXE,那可以在代码里添加端口参数的支持;如果是第三方程序,建议联系开发者或者查看官方文档,确认是否有隐藏的端口配置方式。
另外要注意:如果第二个实例启动失败,大概率是5000端口被第一个实例占用了,这时候一定要给第二个实例指定不同的端口才能正常运行。
内容的提问来源于stack exchange,提问作者hmd.pouya
相关产品推荐
相关产品推荐

