1

我有一个产生错误的 Python 程序:

File "myTest.py", line 34, in run
   self.output = self.p.stdout
AttributeError: RunCmd instance has no attribute 'p'

Python代码:

class RunCmd():

    def __init__(self, cmd):
        self.cmd = cmd

    def run(self, timeout):
        def target():
            self.p = sp.Popen(self.cmd[0], self.cmd[1], stdin=sp.PIPE,
                              stdout=sp.PIPE, stderr=sp.STDOUT)

        thread = threading.Thread(target=target)
        thread.start()
        thread.join(timeout)

        if thread.is_alive():
            print "process timed out"
            self.p.stdin.write("process timed out")
            self.p.terminate()
            thread.join()

        self.output = self.p.stdout             #self.p.stdout.read()?
        self.status = self.p.returncode

    def getOutput(self):
        return self.output

    def getStatus(self):
        return self.status

这是整个回溯。

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
File "myTest.py", line 18, in target
    self.p = sp.Popen(self.cmd, stdin=PIPE,
NameError: global name 'PIPE' is not defined

Traceback (most recent call last):
File "myTest.py", line 98, in <module>
    c = mydd.ddmin(deltas)              # Invoke DDMIN
File "/home/DD.py", line 713, in ddmin
    return self.ddgen(c, 1, 0)
File "/home/DD.py", line 605, in ddgen
    outcome = self._dd(c, n)
File "/home/DD.py", line 615, in _dd
    assert self.test([]) == self.PASS
File "/home/DD.py", line 311, in test
    outcome = self._test(c)
File "DD.py", line 59, in _test
    test.run(3)
File "DD.py", line 30, in run
    self.status = self.p.returncode
AttributeError: 'RunCmd' object has no attribute 'p'

这个错误是什么意思,它想告诉我什么?

4

2 回答 2

1

你没有给出所有的错误信息。线程中的代码失败,因为您对 Popen 的调用是错误的,它应该是:

def target():
    self.p = sp.Popen(self.cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.STDOUT)

由于线程失败,它不会设置“p”变量,这就是你收到你正在谈论的错误消息的原因。

于 2013-06-06T14:44:07.787 回答
0

如何非常简单地在 Python 中重现此错误:

class RunCmd():
    def __init__(self):
        print(self.p)

r = RunCmd()

印刷:

AttributeError: 'RunCmd' object has no attribute 'p'

这是怎么回事:

你必须学会​​阅读和推理你正在处理的代码。像这样描述代码:

我定义了一个名为 RunCmd 的类。它有一个__init__不带参数的构造函数。构造函数打印出局部成员变量 p。

我实例化了一个 RunCmd 类的新对象(实例)。构造函数运行,并尝试访问 p 的值。不存在这样的属性 p,因此会打印错误消息。

错误消息的意思正是它所说的。您需要先创建一些东西才能使用它。如果你不这样做,这个 AttributeError 将被抛出。

解决方案:

  1. 在未创建变量时早些时候抛出错误。
  2. 将代码放入 try/catch 中以在未创建程序时停止程序。
  3. 在使用它之前测试变量是否存在。
于 2015-06-09T17:03:33.020 回答