What is the best way to run a child process for limited time
我正在为我的Raspberry Pi创建一个新脚本(p.py),我正在尝试组合名为Final.py和A.py的2个python脚本。 我想执行Final.py大约5秒钟,然后杀死它并继续攻击A.py,运行它25秒并杀死它并无休止地重复整个过程。 但是,这两个脚本都是循环的,我不知道如何结束这些进程。 这里的p.py代码:
1 2 3 4 5 6 7 8
| 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进程:
1 2 3 4 5 6 7 8 9 10
| 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'])部分值得一个upvote,重用当前的解释器来运行子脚本。
-
@ Jean-Franç oisFabre在我真正解释它之前可能不值得投票,但是......我会编辑它。
-
不解释我,我明白了:)
-
所以它工作谢谢!你也知道如何循环这个p.py脚本吗?
-
@ Jean-Franç oisFabre我的意思是向OP解释,而不是给你。 :)
-
@Tony以同样的方式循环其他任何东西 - 例如,取整个东西并在while True:下缩进它。
-
非常感谢!我非常感谢像你这样有帮助的人!
-
@Tony此外,这个问题已经被关闭了。这意味着存在一个现有的问题(事实上其中两个问题),这些问题的答案应该适用于您的问题,并且随着时间的推移已被多个人推翻。所以一定要去读它们;他们可能已经覆盖了我没有的东西。
-
@abarnert使用python可执行文件的另一个好理由是在使用Windows时。只是使用脚本名称不会削减它,因为Windows不关心shebangs ...你必须使用shell=True(eeeek !!)或cmd /c 前缀(不可移植)。 sys.executable因为它超级便携而晃动(好吧,除非使用cx_freeze或py2exe冻结脚本)
-
@ Jean-Franç oisFabre是的,我故意没有解释如何处理特定的"不同的"案例,因为......它很毛茸茸,可能与OP无关。如果您有一个专门针对Windows的用例,通常答案与py.exe有关。