Search code examples
pythonattributeerror

Python, AttributeError: RunCmd instance has no attribute 'p' for delta debug


I have a Python program that produces an error:

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

The Python code:

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

Here's the entire back trace.

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'

What does this error mean and what is it trying to tell me?


Solution

  • You didn't give all the error messages. The code in the thread fails because your call to Popen is wrong, it should be:

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

    As the thread fails, it doesn't set the "p" variable, that's why you're getting the error message you're talking about.