8

実行top_level_script.pyすると、次のようなスタック トレースで例外が発生しました。

File "top_level_script.py", line 114, in main
  …
File "top_level_script.py", line 91, in func1
  ...
File "top_level_script.py", line 68, in func2
  **kwargs)
File "/home/max/.../cccc/ffff/mmmm.py", line 69, in some_func
  obj = SomeClass(…)
File "mmm/ttt/bbb/core.py", line 17, in __init__
File "/home/max/.../pppp/pppp.py", line 474, in func
  ...
File "/home/max/.../pppp/pppp.py", line 355, in some_func
  ...

mmm/ttt/bbb/core.pyには相対パスがあり、その上下のフレームには絶対パスがあることに注意してください。また、 の 17 行目の出力はなく、__init__呼び出されたコードは「古い」ものでした。変更したばかりですが、古いコードが呼び出されていました。したがって、例外です。

Python のインポート メカニズムは、いまだに混乱を招くことがあります。何が起きているのcore.pyか、そのフレームに表示されている相対パスの重要性を説明できる人はいますか?

いくつかいじくり回した後、私の仮説は、python が何らかの形で を呼び出しているというものでした.pyc(したがって、以下の行にソースは示されていません)。ファイルをいじった後(つまり、変更して保存した後)、次のようになりました。

File "top_level_script.py", line 114, in main
  …
File "top_level_script.py", line 91, in func1
  ...
File "top_level_script.py", line 68, in func2
  **kwargs)
File "/home/max/.../cccc/ffff/mmmm.py", line 69, in some_func
  obj = SomeClass(…)
File "/home/max/.../mmm/ttt/bbb/core.py", line 17, in __init__
  ...
File "/home/max/.../pppp/pppp.py", line 474, in func
  ...
File "/home/max/.../pppp/pppp.py", line 355, in some_func
  ...

今、私はその効果を再現することはできませんが、何が起こったのか誰かが知っているかどうかはまだ知りません.

4

1 に答える 1

1

一般に、Python はファイル名をどのように理解するかについて透過的です。

Python が を実行するたびimportに、環境変数PYTHONPATHが参照され、Python 変数が設定されますsys.path

のパス コンポーネントは、sys.path絶対または相対にすることができます。一般的な相対パス名は.(現在の作業ディレクトリ) です。

インポートの実行中に見つかった名前がsys.path相対パスに基づいている場合、スタック トレースに表示されるファイル名も相対パスになります。また、Python プログラムが相対インポートを使用している場合、それも相対ファイル名として表示されると思います。

于 2015-06-14T22:04:15.760 に答える