在Python中的函数内部定义一个子进程?

时间:2018-08-05 09:24:37

标签: python subprocess

我对以下代码有疑问。

    def play():
        process = "......"
        h=subprocess.Popen(process)

    def stop():
        h.terminate()

它表示不能执行此操作,因为未定义h。这是因为它不是全球性的,如果是的话,我如何使其成为全球性的以便它可以找到它。我尝试在程序开始时使用global来定义变量h,但是它不起作用。

谢谢

2 个答案:

答案 0 :(得分:0)

如果您做了这样的事情:

h = placeholdervalue
def play():
    process = "......"
    h=subprocess.Popen(process)

def stop():
    h.terminate()

然后hplay只会隐藏全局定义,而不会覆盖全局定义(这不是参考)。

我会说最好不要使用全局变量:

def manager():
    //Do interesting stuff
    h = play()
    //Some more stuff
    stop(h)  //Only need a stop function if you need more cleanup. Otherwise terminate immediately

def play():
    process = "......"
    return subprocess.Popen(process)

def stop(aproc):
    aproc.terminate()

更容易扩展和更安全。

答案 1 :(得分:0)

这在函数h的范围内定义了一个名为play的变量:

def play():
    process = "......"
    h=subprocess.Popen(process)

在函数h的范围内没有名为stop的变量,因此失败:

def stop():
    h.terminate()

不知何故,h必须发送到stop。我看到两种方式。

第一个选项,play返回hstop接收i作为自变量(如kabanus' answer

第二个选项,创建一个类:

class Player:
    def __init__(self):
        self.process = None

    def play(self):
        assert self.process is None, "Already playing"
        self.process = subprocess.Popen("...")

    def stop(self):
        assert self.process is not None, "Not playing"
        self.process.terminate()
        self.process = None