Python,AttributeError:RunCmd实例没有属性';p';用于增量调试

Python,AttributeError:RunCmd实例没有属性';p';用于增量调试,python,attributeerror,Python,Attributeerror,我有一个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):

我有一个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'
线程1中的异常: 回溯(最近一次呼叫最后一次): 文件“/usr/lib/python2.7/threading.py”,第552行,在引导程序内部 self.run() 文件“/usr/lib/python2.7/threading.py”,第505行,运行中 自我目标(*自我参数,**自我参数) 文件“myTest.py”,第18行,在目标中 self.p=sp.Popen(self.cmd,stdin=PIPE, NameError:未定义全局名称“管道” 回溯(最近一次呼叫最后一次): 文件“myTest.py”,第98行,在 c=多年电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价日电价 文件“/home/DD.py”,第713行,单位为ddmin 返回self.ddgen(c,1,0) ddgen中的文件“/home/DD.py”,第605行 结果=自我(c,n) 文件“/home/DD.py”,第615行,在 断言self.test([])==self.PASS 文件“/home/DD.py”,第311行,测试中 结果=自我测试(c) 文件“DD.py”,第59行,在测试中 测试运行(3) 文件“DD.py”,第30行,正在运行 self.status=self.p.returncode AttributeError:“RunCmd”对象没有属性“p”
此错误是什么意思?它试图告诉我什么?

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

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

当线程失败时,它不会设置“p”变量,这就是为什么您会收到所说的错误消息。

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

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

当线程失败时,它不会设置“p”变量,这就是为什么您会收到所说的错误消息。

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

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

r = RunCmd()
AttributeError: 'RunCmd' object has no attribute 'p'
打印:

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

r = RunCmd()
AttributeError: 'RunCmd' object has no attribute 'p'
发生了什么事:

你必须学会阅读和推理你正在处理的代码。用这样的语言表达代码:

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

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

错误消息的意思与它所说的完全一致。您需要先创建一些内容,然后才能使用它。如果不创建,将抛出此AttributeError

解决方案:

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

r = RunCmd()
AttributeError: 'RunCmd' object has no attribute 'p'
  • 未创建变量时,在前面抛出一个错误
  • 将代码放入try/catch中,以便在程序未创建时停止程序
  • 在使用变量之前先测试它是否存在

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

    class RunCmd():
        def __init__(self):
            print(self.p)
    
    r = RunCmd()
    
    AttributeError: 'RunCmd' object has no attribute 'p'
    
    打印:

    class RunCmd():
        def __init__(self):
            print(self.p)
    
    r = RunCmd()
    
    AttributeError: 'RunCmd' object has no attribute 'p'
    
    发生了什么事:

    你必须学会阅读和推理你正在处理的代码。用这样的语言表达代码:

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

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

    错误消息的意思与它所说的完全一致。您需要先创建一些内容,然后才能使用它。如果不创建,将抛出此AttributeError

    解决方案:

    class RunCmd():
        def __init__(self):
            print(self.p)
    
    r = RunCmd()
    
    AttributeError: 'RunCmd' object has no attribute 'p'
    
  • 未创建变量时,在前面抛出一个错误
  • 将代码放入try/catch中,以便在程序未创建时停止程序
  • 在使用变量之前先测试它是否存在