【问题标题】:How can I define a subprocess in the __init__() part in Python?如何在 Python 的 __init__() 部分定义子进程?
【发布时间】:2015-06-14 13:32:36
【问题描述】:

考虑以下类:

import subprocess

class Fruits():
    def __init__(self):
        self.TERMINAL_WIDTH = 80

    def start(self):
        p = subprocess.Popen(["mplayer", "other", "args"])
        print "Subprocess started..."

此代码有效。

为了更深入地了解最佳编码实践,我将 PEP 8 linter 用于 Python。 linter 抱怨这条线

p = subprocess.Popen(["mplayer", "other", "args"])

:linter 说因为我们定义了一个变量 (p),它可能应该转而使用 __init__() 方法。

不过,我想知道如何做到这一点。如果我将该行以当前形式传输到__init__(),子进程将在Fruits() 被实例化时开始运行,这不是我想要的。你能帮帮我吗?

【问题讨论】:

  • 不知道为什么 linter 会告诉你这一点,除非它分配给 self 上的属性,但 p 是这里的本地人。在任何情况下都知道 linter 可能是错误的,此时您禁用 linter(针对该行)。
  • 您能否向我们展示 a) 您正在使用什么 linter 以及 b) 确切的错误消息(确保您的最小示例产生该错误消息)。

标签: python coding-style


【解决方案1】:

首先,您正在创建一个局部变量。是可以的,但是方法执行完成后就丢失了。

您很可能想要一个实例变量。然后该行必须如下所示:

self.p = subprocess.Popen(["mplayer", "other", "args"])

p 也是一个糟糕的名称选择,您应该使用更长的名称,例如mplayer_proc

然后是在__init__ 中初始化所有实例变量的约定,它不是必需的,但在您使用 IDE 时非常有用。你不需要给它一个最终值。如果您在初始化时没有要存储的内容,只需将其设置为None

class Fruits():
    def __init__(self):
        self.TERMINAL_WIDTH = 80
        self.mplayer_proc = None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 2011-08-31
    • 2015-01-05
    • 2020-09-23
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多