Python 在循环中以最大时间限制运行外部程序

Python 在循环中以最大时间限制运行外部程序,python,Python,我希望有一个python脚本,可以在循环中顺序运行外部程序。我还想将程序的每次执行限制为最大运行时间。如果超过,则终止程序。实现这一目标的最佳方式是什么 谢谢 要从Python运行外部程序,通常需要使用 您可以使用os.fork()和os.execve()(或其exec*表亲之一)来“滚动您自己的”子流程处理。。。使用您喜欢的任何文件描述符管道和信号处理魔法。但是,subprocess.Popen()函数已经实现并公开了您想要为您做的大部分功能 要安排程序在给定的时间段后死亡,可以让Python

我希望有一个python脚本,可以在循环中顺序运行外部程序。我还想将程序的每次执行限制为最大运行时间。如果超过,则终止程序。实现这一目标的最佳方式是什么


谢谢

要从Python运行外部程序,通常需要使用

您可以使用
os.fork()
os.execve()
(或其
exec*
表亲之一)来“滚动您自己的”子流程处理。。。使用您喜欢的任何文件描述符管道和信号处理魔法。但是,
subprocess.Popen()
函数已经实现并公开了您想要为您做的大部分功能

要安排程序在给定的时间段后死亡,可以让Python脚本在超时后将其杀死。当然,您需要检查流程是否在此之前已经完成。下面是一个非常愚蠢的示例(使用中的
split
函数以增加可读性:

from shlex import split as splitsh
import subprocess
import time

TIMEOUT=10
cmd = splitsh('/usr/bin/sleep 60')
proc = subprocess.Popen(cmd)
time.sleep(TIMEOUT)
pstatus = proc.poll()
if pstatus is None:
    proc.kill()
# Could use os.kill() to send a specific signal
# such as HUP or TERM, check status again and 
# then resort to proc.kill() or os.kill() for
# SIGKILL only if necessary
如前所述,有几种方法可以终止您的子进程。请注意,我检查“
是无的
”,而不是测试
pstatus
的真实性。如果您的进程在退出值为零的情况下完成(传统上表示没有发生错误),则对
proc.poll()进行天真的测试
结果会将完成与仍在运行的流程状态混为一谈

还有一些方法可以确定是否已经过了足够的时间。在本例中,我们睡觉,如果我们还可以做其他事情,这有点愚蠢。这只会让我们的Python进程(外部程序的父进程)处于空闲状态

您可以使用
time.time()
捕获开始时间,然后启动子流程,然后执行其他工作(例如启动其他子流程)并检查时间(可能在其他活动的循环中),直到超过所需的超时

如果您的其他活动涉及到文件或套接字(网络)操作,那么您需要考虑使用一种方法来返回一个文件描述符列表,该文件描述符具有“异常”事件可读、可写或准备好。<代码>选择。()/代码>函数也具有可选的“超时”值。,x)基本上与

time.sleep(x)
相同(在我们不提供任何文件描述符供其选择的情况下)

代替
select.select()
也可以使用模块将文件描述符设置为非阻塞模式,然后使用
os.read()
(不是普通的文件对象
.read()
方法,而是。同样,最好在可能的情况下使用更高级别的接口,并且只有在必要时才使用较低级别的函数。(如果使用非阻塞I/O,则所有的
os.read()
或类似操作都必须在异常处理块中完成,因为Python将“-ewoldblock”条件表示为操作错误(例外)如:“OSError:[Errno 11]资源暂时不可用”(Linux)。错误的确切数目可能因操作系统而异。但是,它应该是可移植的(至少对于POSIX系统而言),以便使用来自的
-ewoolblock

(我意识到我在这里有点不知所措,但是当您的子进程运行外部程序时,有关您的程序如何做一些有用的事情的信息是如何管理这些程序超时的自然延伸)

关于非阻塞文件I/O的丑陋细节(包括MS Windows的可移植性问题)过去曾在这里讨论过:


正如其他人所评论的,最好提供更详细的问题,并包含简短、重点突出的代码片段,以显示您已经做出了哪些努力。通常您不会发现这里的人倾向于编写教程而不是答案。

要从Python运行外部程序,您通常需要使用

您可以使用
os.fork()
os.execve()
(或其
exec*
表亲之一)使用您喜欢的任何文件描述符管道和信号处理魔法来“滚动您自己的”子流程处理函数已经实现并公开了您想要为自己做的大部分功能

要安排程序在给定的时间段后死亡,您可以让Python脚本在超时后将其杀死。当然,您需要检查该过程在此之前是否已完成。下面是一个非常愚蠢的示例(使用中的
split
函数以增加可读性:

from shlex import split as splitsh
import subprocess
import time

TIMEOUT=10
cmd = splitsh('/usr/bin/sleep 60')
proc = subprocess.Popen(cmd)
time.sleep(TIMEOUT)
pstatus = proc.poll()
if pstatus is None:
    proc.kill()
# Could use os.kill() to send a specific signal
# such as HUP or TERM, check status again and 
# then resort to proc.kill() or os.kill() for
# SIGKILL only if necessary
如前所述,有几种方法可以终止您的子进程。请注意,我检查“
是无的
”,而不是测试
pstatus
的真实性。如果您的进程在退出值为零的情况下完成(传统上表示没有发生错误),则对
proc.poll()进行天真的测试
结果会将完成与仍在运行的流程状态混为一谈

还有一些方法可以确定是否已经过了足够的时间。在本例中,我们睡觉,如果我们还可以做其他事情,这有点愚蠢。这只会让我们的Python进程(外部程序的父进程)处于空闲状态

您可以使用
time.time()
捕获开始时间,然后启动子流程,然后执行其他工作(例如启动其他子流程)并检查时间(可能在其他活动的循环中),直到超过所需的超时

如果您的其他活动涉及到文件或套接字(网络)操作,那么您需要考虑使用一种方法来返回一个文件描述符列表,这些文件描述符是可读的、可写的或准备好的“异常”事件。