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

时间:2017-04-14 18:18:56

标签: python subprocess

如何在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')

当我运行此代码时,我收到此错误:

Traceback (most recent call last):
  File "test.py", line 15, in <module>
    myfunction('stop')
  File "test.py", line 11, in myfunction
    process.send_signal(signal.SIGINT)
UnboundLocalError: local variable 'process' referenced before assignment

3 个答案:

答案 0 :(得分:1)

您需要保存子流程变量并将其传递给函数。当您致电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)

答案 1 :(得分:0)

您需要学习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()

这不太理想,因为它允许您创建几个新进程。 在这种情况下,经常使用单独模式,这确保只有一个进程正在运行但它有点过时了。

最小修复(保持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.SIGINT)

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

答案 2 :(得分:0)

您遇到的问题似乎是由于process被声明为myfunction中的局部变量,特别是仅在'start' if语句中。这个小范围意味着当您致电myfunction('stop')时,该功能没有“过程”的概念。变量。

有几种方法可以解决这个问题,但最直观的方法是myfunction在制作一个process时返回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) ,并在需要关闭时将其作为参数。代码看起来像:

npm run watch

我刚刚在2.7.13中运行了它,它运行良好