从python函数启动和终止子进程

2024-04-26 22:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在python中编写一个可以启动和终止子进程的函数??在

这是我目前为止的代码:

import subprocess
import signal
import time

def myfunction(action):
    if action == 'start':
        print 'Start subrocess'
        process = subprocess.Popen("ping google.com", shell=True)
    if action == 'stop':
        print 'Stop subrocess'
        process.send_signal(signal.SIGINT)

myfunction('start')
time.sleep(10)
myfunction('stop')

当我运行这段代码时,我得到一个错误:

^{pr2}$

Tags: 代码importsignaliftime进程actionprocess
3条回答

你需要学习OOP并用构造函数和析构函数定义MyClass。 假设您不需要运行进程的许多副本,并且为了使它更加奇特,我们可以使用类方法

class MyClass(object):
    @classmethod
    def start(self)
        print 'Start subrocess'
        self.process = subprocess.Popen("ping google.com", shell=True)

    @classmethod
    def stop(self)
        self.process.send_signal(signal.SIGINT)

MyClass.start()
MyClass.stop()

这并不理想,因为它允许您创建多个新流程。 在这种情况下,常常使用singleton模式,这样可以确保只有一个进程在运行,但它有点过时。在

最小的解决方法(保留myfunction)是将进程保存在变量中:

^{pr2}$

您遇到的问题似乎是由于process被声明为myfunction中的局部变量,尤其是仅在'start'if语句中。这个小范围意味着当您调用myfunction('stop')时,函数没有“process”变量的概念。在

有几种方法可以解决这个问题,但最直观的方法是myfunction在生成一个时返回{},并在您想要关闭它时将其作为参数。代码看起来像:

import subprocess
import signal
import time


def myfunction(action, process=None):
    if action == 'start':
        print 'Start subrocess'
        process = subprocess.Popen("ping google.com", shell=True)
        return process       
    if action == 'stop':
        print 'Stop subrocess'
        process.send_signal(signal.SIGTERM)



process = myfunction('start')
time.sleep(10)
myfunction('stop', process)

我刚跑完这一关就好了

您需要保存子流程变量并将其传递到函数中。当您调用myfunction('stop')时,函数作用域没有地方可以从中获得process(因此是UnboundLocalError)。在

如果没有函数作用域,这应该可以很好地工作-这表明您的问题与函数范围有关,而不是与过程处理有关:

print 'Start subrocess'
process = subprocess.Popen("ping google.com", shell=True)
time.sleep(10)
print 'Stop subprocess'
process.send_signal(signal.SIGINT)

相关问题 更多 >