python subprocess简单使用

创建子进程:

import subprocess

cmd = 'python3 -u server.py'
server_process = subprocess.Popen(cmd.split(), shell=False, stdout=subprocess.PIPE, cwd=os.getcwd(), start_new_session=True)

# 获取子进程输出,但会阻塞
# for line in iter(server_process.stdout.readline, b''):
#     print(line)

参数:

python的-u参数:可让输出不被缓冲,避免出现程序stdout不输出的情况。

shell=True:可轮流执行多个指令,指令之间分号隔开。pyinstaller打包后,shell=True时子进程不会跳出黑框,而shell=False会跳出黑框。
cwd=os.getcwd():子进程以父进程的工作目录为准。
start_new_session=True:子进程与父进程分离,不受父进程影响。

父进程关闭子进程:

方法一:若 subprocess.Popen的shell参数为False时,执行以下指令可关闭子进程:

server_process.kill()    # server_process是subprocess.Popen返回的对象
pid, status = os.wait()

注:一定要调用os.wait()以回收资源,否则子进程会变为僵尸进程。

方法二:下述方法等同于shell指令kill -9,linux下可用。 

with open(file_path, 'r') as f:
    pid = int(f.read())
    os.kill(pid, signal.SIGKILL)

方法三:若 subprocess.Popen的shell参数为True时,上述方法无法关闭shell。执行以下指令关闭子进程:

process = psutil.Process(server_process.pid)
for child in process.children(recursive=True):
    child.kill()
process.kill()

子进程输出pid:

子进程可输出pid,用于被其他进程控制:

pid = os.getpid()
with open(file_path, 'w') as f:
    f.write(str(pid))

父进程可根据pid判断子进程是否存活:

with open(file_path, 'r') as f:
    pid = int(f.read())
    stat = psutil.pid_exists(pid)
    if stat is True:
        print('alive')
    else:
        print('dead')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值