关于python:在有限的时间内运行子进程的最佳方法是什么

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.

有没有人知道更好的想法或更好的解决方法? 一切都将不胜感激!


你要做的事情并没有任何意义。你运行这样的子脚本:

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

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

答案很简单 - 您已经导入subprocess,您只需要使用它来运行子脚本而不是使用execfile。然后你甚至不需要1.sh2.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.7python3.x标记为问题,因此您可能需要考虑应使用哪个Python来运行子脚本。使用sys.executable意味着它将与用于运行控制器脚本的那个相同,这通常是你想要的(但如果没有,显然会做一些不同的事情,无论是"硬编码python3"还是"无论shbang说什么"或任何适当的)。

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