python程序一旦构建就不会停止

时间:2014-03-25 11:44:17

标签: python ubuntu subprocess

我启动此程序all.py

import subprocess
import os

scripts_to_run = ['AppFlatForRent.py','AppForSale.py','CommercialForSale.py','LandForSale.py','MultipleUnitsForSale.py','RentalWanted.py','RentCommercial.py','RoomsForRent.py','RoomsWanted.py','ShortTermDaily.py','ShortTermMonthly.py','VillaHouseForRent.py','VillaHouseForSale.py']


for s in scripts_to_run:
    subprocess.Popen(["python", os.path.join(os.getcwd(), s)])

一次运行13个程序。问题是,在崇高 - 与其他程序不同 - 这个特定的程序不会取消构建。它只是继续运行(我知道因为程序正在输入数据库中的值,它并没有停止这样做)

我希望通过终端来完成。

任何帮助?

2 个答案:

答案 0 :(得分:0)

要停止所有子脚本,您可以调用.terminate().kill()方法:

import sys
import time
from subprocess import Popen

# start child processes
children = [Popen([sys.executable or 'python', scriptname])
            for scriptname in scripts_to_run]

time.sleep(30) # wait 30 seconds

for p in children:
    p.terminate() # or p.kill()

for p in children:
    p.wait() # wait until they exit

答案 1 :(得分:0)

您可以采取两种方法。

shell方法

如果您只想在主应用程序完成后终止子进程但不希望主应用程序本身处理此问题,无论出于何种原因(主要用于调试目的),您可以从终端执行此操作:

   kill $(ps aux |grep -E 'python[[:space:]][[:alnum:]]+.py' |awk '{print $2}')  
             ▲     ▲                                      ▲            ▲  
             ║     ╚═══════════════════╦══════════════════╝            ║  
Get all ═════╝                         ║                               ║  
running                                ║                Get the second column  
processes                  Find all scripts executed         which is the PID 
                           by Python, ending with .py
                        (check Note 1 for more details)

注1 :上面示例中的正则表达式仅用于演示目的,它仅杀死使用python script.py之类的相对路径执行的脚本,但不包括python /path/to/script.py之类的进程1}}。这只是一个示例,因此请确保使正则表达式适应您的特定需求 注意2 :这种方法存在风险,因为它可以杀死不需要的应用程序,确保在使用之前知道自己在做什么。

Python方法

另一种方法提供更多控制,并在主应用程序本身中实现。 通过跟踪您创建的所有进程并在之后终止它们,您可以确保在主应用程序结束时退出所有子进程。

示例用法:
首先更改您的流程生成代码,以保留正在运行的流程的Popen个对象供以后使用:

running_procs = []
for s in scripts_to_run:
    running_procs.append(
                  subprocess.Popen(["python", os.path.join(os.getcwd(), s)])
                        )

然后定义将遍历它们并终止它们的do_clean()函数:

def do_clean():
    for p in running_procs:
        p.kill()

您可以在需要时手动调用此函数,也可以在应用程序终止时使用atexit模块执行此操作。

  

atexit模块定义了一个注册清理的函数   功能。这样注册的功能会自动执行   正常的翻译终止。

     

注意:当通过此模块注册的功能时不会被调用   当一个Python时,程序被Python处理的信号杀死   检测到致命的内部错误,或者调用os._exit()时。

例如:

import atexit

atexit.register(do_clean)