輸入

2017-08-11 10 views
0

ちょっと私はそうのように設定したフォルダ構造とセット階層モジュールを持つプロジェクトに取り組んでいます:輸入

module_name/ 
    __init__.py 
    constants.py 
    utils.py 
    class_that_all_submodules_need_access_to.py 

    sub_module_a/ 
     __init__.py 
     sub_module_a_class_a.py 
     sub_module_a_class_b.py 
     useful_for_sub_module_a/ 
      __init__.py 
      useful_class_a.py 
      useful_class_b.py 

    sub_module_b/ 
     __init__.py 
     sub_module_b_class_a.py 
     sub_module_b_class_b.py 

などなどなど...

問題ですが、 .pyにインポートを設定する方法がわからないので、sub_module_a/useful_for_sub_module_a/useful_class_a.pyからclass_that_all_submodules_need_access_to.pyにアクセスできます。

Google/StackOverflowでこれを調べてみると、疲れてしまいました。 PyCharmのプロジェクトで作業しているときにこのバグに遭遇しないように、PyCharmにはパスが設定されていますが、他の環境からのみアクセスできます。

ここでは、私が思いついた特に控えめな解決策を紹介します。マイsub_module_a/useful_for_sub_module_a/のinitの.pyのようになります。これはsub_moduleで_ * /、どこの代わりに3の似ている

import sys 
import os 

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))) 

import module_name 

」.. 'それだけで2(IEのS' .. '' ..上記のsys.path.insert行では '..'、 '..'、 '..'の代わりに ')を使用します。そしてsub_module_a/useful_for_sub_module_a/useful_class_a.pyで、私はこのようなモジュール名/ constants.py(その他)をインポートする必要があります。このソリューションが動作します

import module_name.constants 
from module_name.class_that_all_submodules_need_access_to import ImportantClass 

ながらがより良い/よりがある場合、私は思っていましたエレガントな方法でインポートおよび/またはフォルダの階層を設定する?私はこのモジュールのユーザのためのpythonシステムパスをつぶすことについてが心配です。それも有効な懸念ですか?

答えて

0

Pythonのインポートには絶対と相対の2種類があります:Python importを参照してください。しかし、最初にインポートするのは、Pythonがあなたのパッケージを見つける方法を理解する必要があるということです。あなたのホームフォルダの下にパッケージを置くだけであれば、Pythonはそれについて何も知りません。あなたはこのブログ[Python search](https://leemendelowitz.github.io/blog/how-does-python-find-packages.html)をチェックすることができます。

こうしてモジュールをインポートするには、まずPythonにあなたのパッケージを知らせることです。 Pythonがパッケージを検索する場所を知った後で、この目的を達成するには多くの場合2つの方法があります。

(1)PYTHONPATH環境変数。この変数は、環境設定ファイルに設定します(例:.bash_profile)。これはまた、最も簡単な方法です。

(2)を使用すると、パッケージの配布に役立ちます。これは長い話です。あなたが将来あなたのパッケージを配布しない限り、あなたがそれを選ぶことをお勧めしません。しかし、それを知る価値があります。

パスを正しく設定すると、Pythonのインポートはまっすぐ進むだけです。あなたは絶対的なインポートを使用したい場合は、相対インポートを使用したい場合、それはあなたが今あるどのモジュールに依存し、

from module_name import class_that_all_submodules_need_access_to 

を試してみてください。相対インポートのみfrom .xx import xxフォーマットをサポートしていることを

from .class_that_all_submodules_need_access_to import XX_you_want 

注意をしてみてくださいそして、あなたはモジュールmodule_name.sub_module_a.sub_moduel_a_class_aを書いているとしましょう。

ありがとうございました。

+0

また、サイトのパッケージフォルダにコピーするだけの解決策です:) –