2016-08-14 9 views
0

奇妙なインポートエラーがありました。Pythonのインポートに失敗しました

. 
+-- outer 
| +-- inner 
| | +-- __init__.py 
| | +-- first.py 
| | +-- second.py 
| +-- __init__.py 
+-- main.py 

main.py:

import outer.inner 
print(outer.inner.var) 

アウター/ __ init__.py:空

アウター/インナー/ __ init__

私はCPythonの-3.5

のディレクトリ構造を使用します.py:

インナー/

アウター/ first.py:second.py /インナー/アウター

import outer.inner.second 
var = outer.inner.second.var 

var = 1337 

、その後、私はmain.pyを実行し、スクリプトがこのスタックトレースで失敗します。

Traceback (most recent call last): 
    File "main.py", line 1, in <module> 
    import outer.inner 
    File "/outer/inner/__init__.py", line 1, in <module> 
    import outer.inner.first 
    File "/outer/inner/first.py", line 2, in <module> 
    var = outer.inner.second.var 
AttributeError: module 'outer' has no attribute 'inner' 

したがって、Pythonでは名前を正しくバインドしたくありません。 first.pyでimport文が:import outer.inner.secondがクラッシュすることなく実行され、この文はありません(ただし、必要があります)モジュールはinner

私が間違って何をすればいいという名前の空のパッケージのようなouter何かを、名前に結合しますか?

+0

「内部」はなぜ「外部」からインポートしようとしていますか?なぜ、 'first.py'は、' from .second import var'からだけですか? – jonrsharpe

+0

@jonrsharpe私はPythonには比較的新しいですが、相対的なインポートはかなり議論の余地があると聞きました。そして、とにかく、私はちょうどここで間違って何がやっているのかを知りたいだけです。 –

+0

https://docs.python.org/3/tutorial/modules.htmlを見てから[まだ必要な場合は質問を明確にするために編集]をクリックします。 – jonrsharpe

答えて

2

絶対パスではなく相対パスをインポートする方がよいでしょう。私はあなたが達成しようとしているのか分からないが、同じレベルでのファイルから何かをインポートする正しい方法は、あなたのfirstファイルの使用時にはそれほどのようなものドット.を使用することです:

from .second import var as second_var 
var = second_var 

そして、あなたのinner/__init__.py中を

名前の競合を避けるだけでなく、名前をシンプルでユニークで読みやすいコードにすることができます。

EDIT:また

あなたmain.pyモジュール内のインタプリタのコメントを追加することを検討するPythonの北西ある場合。これは、UNIX系システム(OS X、Linuxなど)のユーザにとって便利です。

#!/usr/bin/env python3 
関連する問題