2016-08-05 10 views
0

私はここに似たような質問がたくさんあることを知っていますが、自分のプロジェクトに最も適しているのはわかりませんでした。以来(ルートディレクトリのMakefileには、その後data_management(生データを準備する)とanalysis、またはそれぞれそのサブディレクトリに座って、いくつかのスクリプトを実行し中小規模のデータサイエンスプロジェクトで絶対パスを使用したインポート

project-name/ 
    docs/ 
    src/ 
     __init__.py 
     config.yml 
     Makefile 
     data/ 
     data_management/ 
      __init__.py 
      process1.py 
      process2/ 
     analysis/ 
      __init__.py 
      analysis1.py 
      analysis2/ 
     library/ 
      __init__.py 
      config.py 
:これは、次の方法で編成小さなデータ研究プロジェクトでありますいくつかのプロセスは時にはかなり広範囲です)。

これらのモジュールのそれぞれは自己完結型ですが、それは両方とも、関数/クラスをlibraryディレクトリからインポートしています(私は自己完結型モジュールの原則に違反するのは避けなければなりませんが、 functinosをコピーすることなくそれを解決する方法)。一つの例は、問題(データベース情報を管理し、関連するサブディレクトリ、別のユーザーの仕様などへのパス)config.pyの私のコンフィギュレーションクラス

です:私はこれらのスクリプトのそれぞれで絶対インポートパスを持っていることができれば、私は最高のそれを見つけますつまり、プロジェクトのどこにでもimport library.configと書くことができたらしかし、それはこの上またはその他のスクリプト(私の「パス管理システム」にアクセスするためには、私はパスを指定の問題に遭遇しているため)で

# project-name/src/data_management/process1/data_to_sql.py  
import os 
import sys 
sys.path.insert(0, os.path.abspath('..')) 
import library.config 
config = library.config.Configuration() 

を持つことが間違って感じています。

質問:どのファイルでsys.path.insertをしなくてもいいですか? PYTHONPATHを編集しないでください。そうでなければ、どうすればmakefileでこの設定を自動化できますか?(最終的に、このコードを他の人と共有したいからです)

ありがとうございます。

編集:私はPython 2.7.11を使用します。

答えて

0

いくつかのポイント:

  1. これは、Python 2.7である場合は、それをインポート可能にするために、各ディレクトリ内に__init__.pyを持っている必要があります。 Python 3では必要ありません。
  2. メークファイルはsrcから実行されるので、それがインポートのベースとなります。各スクリプトにはsys.path.insert(0, '.')が必要です。その後、from analysis.analysis1 import foo, barを自由に使用してください。
  3. PYTHONPATHなどから配布、インストール、呼び出しできるようにスクリプトをパッケージ化するための推奨方法についてはhttps://github.com/pypa/sampleprojectをご覧ください。 python -c 'import mypackageを実行してください。
0

私が気づいたのは、あなたがconfigファイルについて書いたときに、あなたは「config.py」を書きました。しかし、あなたのコードでは、.ymlファイルのようです。あなたがの.pyファイルを使用することを選択したい場合、あなたはこのようにそれをアクセスすることができました

from src import config 
+0

冗長性はありますが、たとえば、必要な情報がすべて指定されていることを保証するために、いくつかの「整合性チェック」が必要なため、クラスを作成します。 – Jhonny

+0

config.pyでConfigurationクラスを作成する場合は、 "src.config import Configuration"から作業する必要があります。しかし、私は "src"の名前をプロジェクトに関連するものに変更することをお勧めします。プロジェクト名をもう一度使用します。それはあなたの輸入をより明確にし、あまり曖昧さをなくします。また、Nils Wernerのガイドラインに従い、setup.pyを作成することをお勧めします。 https://docs.python.org/2/distutils/setupscript.html –

3

あなたはproject-namesetup.pyファイルを作成することで、プロジェクトのうち、パッケージを作ることができます。その後、あなたは

pip install -e project-name/ 

を行うことができますし、

from __future__ import absolute_import 

をすればどこからでも自分のPython環境にあなたがして

import project_name 
import project_name.library.config 

はまた、あなたが

のようなimport文を行うことができますすることができます
from ..library import config 

とsentially imported ../library/config.py

+0

これは 'import src.library.config 'でなければならないので、私のプロジェクト構造に合わないのですか?私はあなたのポイントを得る、しかし、ありがとう。 – Jhonny

+0

[あなたまではあなたのもので、 'setup.py'に何を置くかによって異なります(https://setuptools.readthedocs.io/ja/latest/setuptools.html)。 'src /'の内容は 'import project_name.src'または' import project_name'で終わることがあります。 –

関連する問題