2017-05-17 6 views
0

私のプログラムを設計するためのソリューションを探しています。Python /インポートとプログラムの設計

私のプログラムは、3つのブロックで構成されています。私は

program_folder/ 
    main.py 
    classes_folder/ 
     class_1.py 
     class_2.py 
    functions_folder/ 
     set_of_func_1.py 
     set_of_func_1.py 
    utilities_folder/ 
     set_of_utilities_1.py 
     set_of_utilities_1.py 

  • クラス
  • 機能私は私のプログラムこの方法を構築したい
  • その他のユーティリティ

したい:

  • «classes_folder»のスクリプトはいずれも «functions_folder»のスクリプトをインポートできました。
  • «functions_folder»のスクリプトでは、 は«utilities_folder»のスクリプトをインポートできました。
  • すべてのスクリプトは でした。通常はmain.pyによって使用されています。
  • «メイン»(if __name__ == “__main__”:いくつかのテスト)として を働いていたとき«classes_folderの»、 内のすべてのスクリプトは、«functions_folder»と«utilities_folderの»は、«program_folder» が(私のコンピュータで任意の場所にある可能性が試験することができます«program_folder»への正確なパスに依存するものではありません。

    • «classes_folderの»のすべてのスクリプト、 «functions_folderの»と«utilities_folderの»の変更インポート検索パスを:すべての私は私が持っていると思った以上のことから

  • 現在の作業 ディレクトリをすべてのスクリプトの«program_folder»に設定しますか?

私はそれを行う方法はありますか?
私のアイデアはよく見えるのですか、または予期しない問題がありますか?

答えて

0

あなたは次のようなスケルトンプロジェクトを作成することができます下のコメントを参照してくださいコピーされず、登録されるだけで、正確なパスに依存しますが、この依存関係はプロジェクトファイル自体にハードコードされていません)。

$ python my_project/b/__init__.py 
my_project/__init__.py 
my_project/a/__init__.py 
my_project/b/__init__.py 
0

共通Pythonプロジェクト構造は次のようになります。そして、

project_name/ 
    setup.py 
    requirements.txt 

    project_name/ 
    __main__.py 

    classes/ 
     __init__.py 
     class1.py 
     class2.py 

    functions/ 
     __init__.py 
     functions.py 

    utils/ 
     __init__.py 
     utils.py 

、あなたは相対的に絶対的からインポートを修正し、のようなもの使用してパッケージを実行できます。

$ /path/to/project_name> python -m project_name 

注意をsetup.pyこといくつかのインタプリタの下にパッケージをインストールする場合にのみ必要です。

は:次に、あなたがローカルpip install -e /path/to/project/(プロジェクトフォルダを使用してプロジェクトをインストールすることができます

/path/to/project/ 
    setup.py 
    my_project/ 
    __init__.py 
    a/ 
   __init__.py 
  b/ 
      __init__.py 

==> ./my_project/__init__.py <== 
print('my_project/__init__.py') 

==> ./my_project/a/__init__.py <== 
import my_project 
print('my_project/a/__init__.py') 

==> ./my_project/b/__init__.py <== 
import my_project.a 
print('my_project/b/__init__.py') 

==> ./setup.py <== 
from distutils.core import setup 
setup(name='my_project', 
     version='1.0', 
     description='my_project', 
     author='author', 
     packages=['my_project']) 

:また

+0

どのようにそれは別のフォルダにクラスや関数を分割するのが一般的である。その結果

、​​などimport my_project.aは、彼らが意味することをでしょうか?そして、機能は、自分のフォルダを保証するようなutilsとどのように違うのでしょうか? –

+0

明確にするには、util、func、クラスなどを自分のフォルダに分割するのではなく、そのような_layout_を持つことが一般的です。アイデアをより明確にするために著者の名前をコピーしただけです。趣味やプロジェクトの論理構造によっては、必要なものはすべてサブフォルダに入れることができます。 – devforfu