在有限的时间内运行子进程的最佳方法是啥[重复]
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.sh
和2.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.7
和 python3.x
,因此您可能需要考虑应该使用哪个 Python 来运行子脚本。使用 sys.executable
意味着它将与用于运行控制器脚本的脚本相同,这通常是您想要的(但如果不是,显然在那里做一些不同的事情,无论是“硬编码 python3
”还是“无论 shbang 说什么" 或任何合适的)。
(由于您似乎在 POSIX 上,您甚至可以修改 Finaaal.py
和 A.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_freeze
或 py2exe
冻结)以上是关于在有限的时间内运行子进程的最佳方法是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章
第一个进程保持运行而后续进程仅通过参数的最佳 IPC 方法是啥?
在长时间运行的 c 进程和 python 之间进行双向 IPC 的最佳方法是啥?
Java 和 .NET 3.5 之间进程间通信的最佳方法是啥?