检查子进程是否正在执行

时间:2019-03-06 17:39:21

标签: python

我正在尝试使用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()

1 个答案:

答案 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

当然,您可以只使用线程而不是子进程来完成此操作。