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

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 に答える