在有限的时间内运行子进程的最佳方法是啥[重复]

Posted

技术标签:

【中文标题】在有限的时间内运行子进程的最佳方法是啥[重复]【英文标题】:What is the best way to run a child process for limited time [duplicate]在有限的时间内运行子进程的最佳方法是什么[重复] 【发布时间】:2018-09-09 20:54:48 【问题描述】:

我正在为我的 Raspberry Pi 制作一个新脚本 (p.py),并且我正在尝试组合 2 个名为 Final.py 和 A.py 的 python 脚本。我想执行 Final.py 大约 5 秒,然后将其杀死并继续执行 A.py,运行 25 秒并杀死它并无休止地重复整个过程。但是,这两个脚本都是循环的,我不知道如何结束这些进程。这里是 p.py 代码:

import subprocess
import time
execfile('Finaaal.py') #looped script 1
time.sleep(5.0)
subprocess.call(['./1.sh']) #this kills Finaaal.py
execfile('A.py') #looped script 2
time.sleep(25.0)
subprocess.call(['./2.sh']) #this kills A.

有没有人知道任何更好的想法或更好的方法来解决这个问题?一切将不胜感激!

【问题讨论】:

为什么不简单地将 Finaaal.py 制作为 5 秒脚本? 请问我该怎么做 调用execfile 将在此进程中 运行另一个脚本,这意味着1.sh 无法在不终止控制脚本的情况下终止它。跨度> 另外,你为什么要同时标记 2.7 和 3.x?您是否需要一种适用于两者的解决方案? 是的,我想知道这两个版本。但是我怎么能把它做成一个 5 秒的脚本呢? 【参考方案1】:

您尝试做的事情没有任何意义。你像这样运行子脚本:

execfile('Finaaal.py') #looped script 1

但是execfile 只是在当前解释器中运行该脚本,而不是作为一个单独的程序。这意味着脚本 1.sh 不可能在不杀死控制器脚本的情况下杀死 Finaaal.py

答案很简单——你已经导入了subprocess,你只需要使用它来运行子脚本,而不是使用execfile。然后你甚至不需要1.sh2.sh 脚本;您可以直接kill 进程:

import subprocess
import sys
import time

p = subprocess.Popen([sys.executable, 'Finaaal.py'])
time.sleep(5.0)
p.kill()
p = subprocess.Popen([sys.executable, 'A.py'])
time.sleep(5.0)
p.kill()

由于您已将问题标记为 python-2.7python3.x,因此您可能需要考虑应该使用哪个 Python 来运行子脚本。使用 sys.executable 意味着它将与用于运行控制器脚本的脚本相同,这通常是您想要的(但如果不是,显然在那里做一些不同的事情,无论是“硬编码 python3”还是“无论 shbang 说什么" 或任何合适的)。

(由于您似乎在 POSIX 上,您甚至可以修改 Finaaal.pyA.py 以捕获 SIGKILL 并根据需要进行一些干净的关机。或者,如果您想要硬关机而不是硬关机选项,请改用terminate。)

【讨论】:

然后subprocess.Popen([sys.executable, 'Finaaal.py']) 部分值得一票,重用当前解释器来运行子脚本。 @Jean-FrançoisFabre 在我真正解释之前可能不值得一票,不过……我会编辑它。 别解释,我明白了:) @Tony 另外,这个问题已经被关闭了。这意味着存在一个现有问题(实际上是其中两个问题)的答案应该适用于您的问题,并且随着时间的推移已被多人投票赞成。所以一定要去阅读它们;他们可能已经涵盖了我没有涵盖的内容。 @abarnert 使用 python 可执行文件的另一个好理由是在使用 Windows 时。仅使用脚本名称并不能削减它,因为 Windows 不关心 shebangs ......你必须使用 shell=True (eeeek!!) 或 cmd /c 前缀(不可移植)。 sys.executable 摇滚,因为它超级便携(好吧,除非脚本被使用 cx_freezepy2exe 冻结)

以上是关于在有限的时间内运行子进程的最佳方法是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

第一个进程保持运行而后续进程仅通过参数的最佳 IPC 方法是啥?

在长时间运行的 c 进程和 python 之间进行双向 IPC 的最佳方法是啥?

Java 和 .NET 3.5 之间进程间通信的最佳方法是啥?

在批处理文件中执行子字符串的最佳方法是啥?

在过去 X 小时内从 HBase 表中获取所有数据的最佳方法是啥?

在 asp.net 中锁定缓存的最佳方法是啥?