Python 如何在50秒后终止子进程?

Python 如何在50秒后终止子进程?,python,python-3.x,linux,subprocess,popen,Python,Python 3.x,Linux,Subprocess,Popen,我想我有几个问题涉及多个问题。首先,代码: import subprocess username = input ("Enter username: ") subprocess.call(["python3", "sherlock", username]) Popen.terminate() 我正在使用subprocess运行使用python3的sherlock程序。问题是,无论出于何种原因,sherlock程序在完成时不会退出。我不确定这是夏洛克的问题,还是我的问题。老实说,我不在乎,我只想

我想我有几个问题涉及多个问题。首先,代码:

import subprocess
username = input ("Enter username: ")
subprocess.call(["python3", "sherlock", username])
Popen.terminate()
我正在使用
subprocess
运行使用python3的
sherlock
程序。问题是,无论出于何种原因,
sherlock
程序在完成时不会退出。我不确定这是夏洛克的问题,还是我的问题。老实说,我不在乎,我只想在给它50秒跑完后,在我这边杀了它,因为这就是跑完的时间

我读了一些书,据我所知,我应该使用
Popen.terminate()
来杀死它?我知道命令需要更多的运行,我需要告诉它要杀死什么。。。这就是我被困的地方。我不知道如何确定正在运行的进程,然后杀死它。我95%的程序发生在sherlock运行之后,所以它并没有走得很远,所以我需要杀死它,让我的程序继续运行

不知道如何从这里开始


更新:好的,所以我确定程序自己完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续了。它只是坐在那里无所事事。有没有办法强迫它转到脚本的下一行

import subprocess

username = input ("Enter username: ")
a_child_process = subprocess.Popen(args=["python3", "sherlock", username], stdout=subprocess.PIPE)
subprocess.Popen.terminate(a_child_process)
Popen.通信(输入=无,超时=无)

与进程交互:向stdin发送数据。从stdout和stderr读取数据,直到到达文件末尾。等待进程终止

我认为这个函数正是你想要的。您应该在
超时
参数上花费50秒。下面是一个示例代码片段,同样来自文档:

proc = subprocess.Popen(...)
try:
    outs, errs = proc.communicate(timeout=50)
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

试着这样做:

import subprocess
username = input ("Enter username: ")
try:
    ret = subprocess.call(["python3", "sherlock", username], timeout=50)
except subprocess.TimeoutExpired:
    # TODO: manage exception
    pass

某些进程挂起等待来自
stdin
的数据。在这种情况下,关闭该管道并自行等待终止。一些进程捕捉到信号,可能需要一个不太微妙的踢腿来让它们退出

import subprocess
username = input ("Enter username: ")
process = subprocess.Popen(["python3", "sherlock", username],
    stdin=subprocess.PIPE)
process.stdin.close()
try:
    process.wait(50)
except subprocess.TimeoutExpired:
    # timeout expired, be nice
    process.terminate()
    try:
        process.wait(2)
    except subprocess.TimeoutExpired:
        # be mean
        process.kill()
        try:
            process.wait(2)
        except TimeoutExpired:
            # zombies, run!
            print("sherlock could not be killed!")

terminate()
是通过调用类创建的
子流程.Popen
实例(子流程)的方法。但是,我建议使用
Popen.wait()
方法,并将
timeout
参数设置为50秒。我不知道
sherlock
程序。它是将密码作为命令行参数还是在stdin上等待密码?我想你可以为terminate命令添加计时器,使其在50秒后运行,如果这正是你真正想要的。好吧,我确定程序自行完成,而不必杀死它,但问题是一旦程序完成,python脚本不会继续。它只是坐在那里无所事事。有没有办法强迫它转到剧本的下一行?嗨,谢谢你的建议,我试过了,但它似乎不起作用。我没有看到sherlock不能被杀死的消息,sherlock仍然处于打开状态/阻止进程的其余部分运行。我没有看到任何错误或任何事情……好的,因此我确定程序自行完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续。它只是坐在那里无所事事。有没有办法强迫它转到脚本的下一行?好吧,我确定程序自己完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续了。它只是坐在那里无所事事。有没有办法强迫它转到脚本的下一行?好吧,我确定程序自己完成,而不必杀死它,但问题是一旦程序完成,python脚本就不会继续了。它只是坐在那里无所事事。有没有办法强迫它转到脚本的下一行?Python脚本不继续是什么意思?程序终止后,python实例关闭