私はこのプロジェクト構造を持っています:
スクリプト
-- A == AA ++ __init__.py ++ AAA.py ++ AAB.py ++ AAC.py == AB ++ __init__.py ++ ABA.py ++ ABB.py ++ ABC.py -- B == BA ++ __init__.py ++ BAA.py ++ BAB.py ++ BAC.py == BB ++ __init__.py ++ BBA.py ++ BBB.py ++ BBC.py
Scripts/A/AA/AAA.py
内部のクラスを にインポートしたいScripts/B/BB/BBC.py
。私はいくつかの解決策を使用しました:
from AAA import *
私に与えますImportError: No module named AAA
。from Scripts.A.AA.AAA import *
私に与えますImportError: No module named Scripts.A.AA.AAA
。from ..A.AA.AAA import *
私に与えますValueError: Attempted relative import beyond toplevel package
。from ....A.AA.AAA import *
私に与えますValueError: Attempted relative import in non-package
。
私は何をすべきか ?
編集1:
プロジェクトの構造を変更したところ、次のようになりました。
スクリプト
-- elements == A ++ __init__.py ++ AAA.py ++ AAB.py ++ AAC.py == B ++ __init__.py ++ BAA.py ++ BAB.py ++ BAC.py -- general == imports.py == __init__.py -- main.py
すべてのクラスをインポートするために、次のコードを作成しました。
elementDict = []
dirList = os.walk('elements')
for dname in dirList:
fileList = dname[2]
for fname in fileList:
if fname != '__init__.py' and fname.endswith('.py') and (not fname.endswith('_ut.py')) and (not fname.endswith('~')):
path = dname[0].split(os.sep)
path = filter(None, path[path.index('elements'):])
dir = '.'.join(path)
mod = importlib.import_module(dir + '.' + fname[:-3])
for cname, obj in inspect.getmembers(mod, inspect.isclass):
if cname not in elementDict:
elementDict[cname] = obj
これにより、次の結果が得られます。
Traceback (most recent call last):
File "C:\Users\test\Scripts\general\imports.py", line 29, in __init__
mod = importlib.import_module(dir + '.' + fname[:-3])
File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named elements.A.AAA
何か案が?
編集2:
問題は解決しました。私は何も持っていませんでし__init__.py
たelements
。