2013-06-06 4 views
1

У меня есть программа на Python, который производит ошибку:Python, AttributeError: RunCmd экземпляр не имеет атрибута 'р' для дельты отладки

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

питон код:

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

Вы не представили все сообщения об ошибках. Код в потоке не удается, потому что ваш вызов Popen неправильно, он должен быть:

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

Как удается нить, она не устанавливает «р» переменную, поэтому вы получаете сообщение об ошибке ты говоришь о.

+0

awesome, спасибо. – alexy99

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. Throw ошибку раньше, когда переменная не создается.
  2. Поместите код в try/catch, чтобы остановить программу, когда она не создана.
  3. Проверьте, существует ли переменная перед ее использованием.

 Смежные вопросы

  • Нет связанных вопросов^_^