2017-08-31 7 views
0

私は次のプロジェクト構造Pythonプロジェクトに絶対パスを入れる場所はどこですか?

ts_tools 
    /bin 
    /docs 
    /lib 
    /ts_tools 
     /data_transfer 
      /tests 
      data_import.py 
      __init__.py 
     /data_manipulation 
      /tests 
      data_smoothing.py 
      __init__.py 
     __init__.py 
    config.yaml.conf 
    setup.py 
    LICENSE 
    README.md 
    TODO.md 

を持っている私は、外部ソースからdata_import.pyファイルにデータをインポートしたいと思います。各パスは、ts_toolsパッケージ内のすべてのツール(すなわちdata_import.pydata_smoothing.py)のために利用可能であるべきである

root_path: 
    windows: 
     data_fundamental: C:\\Users\\Malcom\\Data_Fundamental 
     data_event: C:\\Users\\Malcom\\Data_Event 
    linux: 
     data_fundamental: /home/data/data_fundamental 
     data_event: /home/data/data_event 

:私はデータの絶対パスを指定するconfig.yaml.confファイルを使用します。さらに、プログラムはosを識別し、それに応じてパス構造を選択する必要があります。

私は

import yaml 

with open("config.yaml.conf", "r") as ymlfile: 
    cfg = yaml.load(ymlfile) 

を使ってYAMLファイルでパスを設定する方法を知っていると私は

if platform.system().lower() == 'windows': 
    ROOT_DATA_PATH = cfg['windows'] 
else: 
    ROOT_DATA_PATH = cfg['linux'] 

でOSを区別する方法を知っているが、私はどこにこれらを配置する場所を知りませんコードスニペット。 setup.pyファイルで使用するのは適切ではないと思います。一方、新しい.pyファイルを指定することは不適切だと考えています。この問題の良い設計構造は何ですか?どこに絶対ファイルパスを指定すべきですか?私のansatzは正しい方向へ一歩進んでいますか?

ありがとうございます。

答えて

0

この場合、ホームディレクトリからの相対パスにすることができます。したがって、~/data_fundamental~/data_event(両方のプラットフォームで同等である必要があります)を持つことができます。あなたは過度に混乱するかもしれない二つの異なる設定のものを持つ、いずれの場合においてもos.path.expandhome

import os.path 

def get_path(s): 
    return os.path.normpath(os.path.normcase(
     os.path.expanduser(os.path.expandvars(s)) 
    )) 

# get_path('~/data_fundamental') on Windows: 
# r'c:\users\malcom\data_fundamental' 
# get_path('~/data_fundamental') on Linux: 
# r'/home/data/data_fundamental' 
# (Assuming your username on Windows is Malcolm 
# and on Linux is data and you haven't changed 
# the default home path) 

でこれを拡張することができ、あなたは簡単にそれを設定しますと、期待通りに実行するために、とにかく~%VARS%${VARS}を展開する必要があります。

あなたの他の選択肢は以下のとおりです。

  • は(setup.pyでそれを書くの環境変数
  • からの読み込み設定ファイルがsetup.pyが書き込み保護にそれを置く可能性があるとして、ここであなたはおそらく、いくつかの方法が変更できるようにする必要があります場所)

また、指定されていない場合は、sys.platform()に基づいてデフォルトを作成するか、ユーザーに設定するように通知するエラーメッセージを表示します。

0

ファイル/データの2つの異なるタイプを識別しましょう。

  • ファイルは/インストール時にユーザーまたはユーザーのために書かれたデータ/定義されたファイル/データ内の絶対パスを持ってしても大丈夫ことができコーダ

によって書かれ

  • ファイル/データを展開ユーザによって実行されるか、ユーザマシン上で実行されるプログラムによって生成される。 絶対パスは、相対パスよりも本質的に脆弱ですが、最初のケースではそれほど悪くありません。

    2番目のケースでは絶対パスを使用しないでください。私はあなたがWindowsとLinuxの2つの異なるパスを使用していることも知っています。あなたはそれをする必要はありませんし、そうしてはいけません。

    Pythonでは、ユーザパスを見つけるのにos.path.expanduser('~')などのものがあり、appdirsのようなパッケージがあります。あなたは可能な限りクロスプラットフォームになりたいと思っています。そして、Pythonはほとんど常に可能です。

  • 関連する問題