我正在尝试使用subprocess.popen执行另一个创建侦听套接字的python脚本。我想通过默认值绑定端口。我还想捕获端口是否已在使用中并且绑定失败。如果失败,那么我想再次调用subprocess.popen,并将另一个数字传递给它尝试绑定。
first.py
import subprocess
p = subprocess.Popen(["python3.7", "test.py", "4444"], shell=False)
#If p is success (bind succeeded) then I want to continue processing code.
#Else I want to increment the port and try again.
start.py
import socket, sys
HOST = '127.0.0.1' # Standard loopback interface address (localhost)
PORT = int(sys.argv[1]) # Port to listen on (non-privileged ports are > 1023)
def stuff():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.bind((HOST, PORT))
except:
print("failed to bind")
return 1
s.listen()
print("Listening")
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
stuff()
答案 0 :(得分:1)
几件事:
仅从调用的函数返回1
不会使进程的退出代码1
。
做sys.exit(stuff())
或直接在sys.exit(1)
中呼叫stuff()
。
您可以使用p.wait()
等待子过程成功或失败,然后再查看p.returncode
。
在您的情况下,您可能想要做类似的事情
import subprocess
p = subprocess.Popen(["python3.7", "test.py", "4444"], shell=False)
try:
p.wait(2)
except subprocess.TimeoutExpired:
pass # it was probably successful and is now listening
else:
if p.returncode == 1:
pass # nope
当然,您可以只使用线程而不是子进程来完成此操作。