2016-05-25 13 views
2

私は質問するつもりですが、非常に些細なものであり、結果的に多くの人が答えました。私は問題を解決するために提供されたソリューションを見てきましたが、私の場合は解決策が見当たりません。異なるフォルダからPythonモジュールをインポート

私は以下のディレクトリ階層を持っています。

----a 
-------__init__.py 
--------------aa 
------------------aa.py 
------------------__init__.py 
--------------bb 
------------------bb.py 
------------------__init__.py 
-------a.py 

私は以下のことをしたいと思います。

  1. (動作しませんaa.pyからbb.pyをインポートするには、各フォルダのディレクトリに
  2. を__init__.py使用することによって達成a.py--ファイルからbb.pyとaa.pyをインポートするには私はすべてのフォルダディレクトリ内__init__.pyファイルを配置している多くのソリューションを見ることによって(動作しない)aa.pyから

をa.pyをインポートする)

  • 私が使用:これは働いていた

    import imp 
    
    foo = imp.load_source('module.name', 'path to the file') 
    

    を、しかし、パスがハードコーディングされなければならないので、私は、これは私の場合は実行可能なソリューションになる場合

    現在、私がやっていることを確認していませんsysディレクトリへのパスを追加してインポートします。よりダイナミックなソリューションが欲しいです。

    私のプロジェクトのフォルダ階層は6-7のレベルのサブディレクトリに深く行くと、私は誰かが指摘することができれば、私は喜んでいるよレベル7

    からレベル1のモジュールをインポートするソリューションが必要私は何が欠けている。

  • +1

    initファイルの名前を '' __init__ 'としたい場合があります。 py'](https://docs.python.org/3/tutorial/modules.html#packages)。 – Evert

    +2

    "私のプロジェクトのフォルダ階層は、6-7レベルのサブディレクトリに行きます。"単純な判断ですが、それはひどいことです。あなたはあなたの構造を再考したいかもしれません。 – Evert

    +0

    initファイルの名前が正しく指定されています。私はinitで__をタイプしている間は知りませんが、__は自動的に削除されます – Sam

    答えて

    1

    アプリケーションのエントリポイントは何ですか?たとえば、コマンドラインのaa.pyファイルから開始すると、あなたは幸運ではありません。

    「アンチパターンとしてパッケージ内のスクリプトを実行しているグイドビュー」( PEP-3122を拒否)

    あなたのパッケージのエントリーポイントはどこかのパッケージのルートにする必要があります。あなたの場合はa.pyというファイルです。そこから、通常どおり内部モジュールをインポートします:

    # contents of a.py 
    from aa import a 
    

    パッケージ内からのインポートについては、

    aa.pyと同じディレクトリにもう1つのファイルaa1.pyがあるとします。 aa.pyからそれをインポートするには、相対インポート機能「を同じディレクトリに」ここ

    # contents of aa.py 
    from . import aa1 
    

    .手段を使用することができます。

    その他の例:

    # contents of aa.py 
    from .. import a # here .. means "one level above" 
    from ..bb import bb # this will import your bb.py module 
    

    たとえば、あなたが直接aa.pyコマンドラインから実行する場合、すべてのその輸入は失敗することに、注意してください!

    UPDATE:上記の例の

    ...は、ディレクトリの名前ではありません。上記の3つのレベルからインポートする必要がある場合は、次のように記述してください:

    from .... import my_module 
    
    +0

    こんにちはLesnik回答。しかし、ここでの解決方法は特にこの場合に有効です。レベル4または5のファイルからレベル1のファイルをインポートする必要がある場合はどうすればよいですか? – Sam

    +0

    プロジェクトはまだリリースされていないので、いくつかのモジュールをデバッグする必要があります。したがって、エントリーポイントはいつでも可能です。 – Sam

    +0

    エントリーポイントはルートレベルでなければなりません。私はこれが必須である理由があると思います。 F.e.あなたはaa.pyから始め、aaと同じレベルにあるモジュールaa1をインポートします。モジュールの名前は "aa1"になります。これで上のモジュール(a.py)をインポートし、そのモジュールは再びaa1.pyをインポートします。今は名前がaa.aa1になります。それは良くない。パッケージ内のすべてのモジュールは永続的な名前を持つ必要があります。 Pythonで使用される命名規則は、package_name.subdir1.subdir2.module_file_nameです。上記の4つのレベルからモジュールをインポートする必要があります: "from ..... import my_module" – lesnik

    関連する問題