2017-02-21 4 views
1

何ヶ月か前、yは時間が経つにつれて小さなプロジェクトで作業を始めました。これは、いくつかのpythonファイルを開始しました:Python 3 - モジュールとパッケージMess - Architecture

project 
│ program_1.py 
│ program_2.py  

私たちは、私はファイルを分離するための一般的な機能を抽出し始めたコードの重複を避けるためにして、複数のプログラムを追加し続けています。

project 
│ program_1.py 
│ program_2.py 
│ program_3.py 
│ shared_module_1.py 
│ shared_module_2.py 

さらにいくつかのプログラムを追加していますが、かなりのサイズがありましたので、私はこのように自分のフォルダに入れました。また、プロジェクトフォルダ内の複数のファイルを落とさないように(これは単なる減少した例であり、フォルダ、ファイルを15+あり):私は、次を使用していた共有モジュールを使用するprogram_4.pyためには

project 
│ program_1.py 
│ program_2.py 
│ program_3.py 
│ shared_module_1.py 
│ shared_module_2.py 
└───program_4 
    │ program_4.py 
    │ program_4_aux.py 

ステートメント:

sys.path.append('../') 

私はこのように続行できません。コードが乱雑になり、保守が難しくなります。私はこの混乱をきれいにする方法を知らない。

PD:私はfrom .. import shared_module_1を使用してみたが、それは私にあなたの時間のためにあなたは非常に多くのparent module '' not loaded cannot perform relative import

感謝を伝えます。

+0

プロジェクトは会社のための便利な自動化ツールのセットです。多くは既に使用されています。私はすべてのコードを壊すことなくこの混乱を掃除する方法が大好きです。 – NMO

+0

これは良い質問だと思うが、現時点では少し幅がある。おそらく、あなたはそれが良いレイアウトになると思うもの、それがうまくいかない理由を絞り込むことができますか? – kazemakase

+0

私の考えは、この大きなフォルダにこの便利なスクリプトをすべて入れ、それらの間でいくつかのロジックを再利用できるようにすることでした。私はこれを達成するためのベストプラクティス(以下のようなpythonの原則)が何であるかを知りたい。 – NMO

答えて

-1

別の解決策は、あなたがモジュールである共有ディレクトリからプログラムを呼び出すことですPermanently add a directory to PYTHONPATH

のように最も簡単な解決策は、あなたがenviromental変数をPYTHONPATHにあなたのプログラムを持っているディレクトリを追加します

python program_4/program_4.py 

解決策ではありませんが .pyファイルも見てください。

第3の選択肢は、共有モジュールをpythonライブラリパッケージに入れることです。

1

djangoのレイアウトを見てください。

顕著なノート:

  • リポジトリのルートが主インポート可能なPythonモジュールない(すなわち、トップレベルのNO INITの.pyファイルが存在しません)。それはサブディレクトリ./djangoにあります。
  • モジュール内で実行できるスタンドアロンのPythonファイルなどのスクリプトは必要ありません。 manage_translations.pyスクリプトは、インポートによっていくつかのdjango機能を使用しますが、./scriptsにあります。また、スクリプトはとなりませんは相対インポートを使用してください(スクリプトはモジュール内にないので!)
  • テストはメインモジュール内には存在しません。
  • sys.pathを変更する必要があると思われる場合は、間違っている可能性があります。
  • djangoパッケージ内の機能は、その機能に基づいて論理的に分割されます。例えば。データベース関連の機能を扱うためのサブモジュール./django/dbがあります。これがうまくいけば、一般的なサブモジュール(存在する場合)は、それが有用であれば、別のプロジェクトに簡単に移動できます。

ので、提案はあなたのプログラムコードからサブディレクトリ別々にすべてのモジュールコードを移動するだろう、何かのように:次に

project 
    module 
     __init__.py 
     module_1.py 
     module_2 
      __init__.py 
      submodule_a.py 
    scripts 
     program1.py 

あなただけprojectがあなたのPYTHONPATHにあることを確認する必要があり、あなたはそうすることができるでしょう

from module.module_1 import Module1Class 

など

関連する問題