2016-06-02 8 views
3

locale/のように)、私はsettings.pyでこれを使用する私のアプリのサブディレクトリにアクセスするためのいくつかのパスを設定するために:その後、テストでも実行スクリプトに対するパスを正しく設定する方法はありますか?

__process_name = os.path.basename(sys.argv[0]) 
__abspath = os.path.abspath(sys.argv[0]) 
__l1 = len(__process_name) 
__l2 = len(__abspath) 
rootdir = __abspath[:__l2-__l1] 

そして、data/にアクセスするには、たとえば:

datadir = rootdir + "data/" 

問題テストを実行するときにsettings.pyを実行すると(python3 -m py.testなど)、sys.argv[0]はもうmyappと一致せず、テストスクリプトはdata/にアクセスできません。

私は、例えば、これに対処する方法を疑問に思う:

  • 私のアプリとテストスイートの両方から同じROOTDIRを取得する方法はありますか?
  • または、自分のアプリケーションにのみsettings.pyを保存し、テストスイートに正しい(ハードコードされた)rootdirを指定する必要がありますか?
  • 設定ファイルにinstalldirを定義します。これはインストール時にセットアップされ、上記のスニペットではなくmyappとそのテストスイートの両方で使用されますか?
  • sys.argv[0]'myappname'で置き換えることも考えましたが、同じ名前の別のディレクトリが存在するため、正しい名前が付いているかどうかはわかりません。 (さらに、別の場所にインストールされたバージョンと1つのデベロッパーバージョンがある場合、それらを区別する方法は?)

これを処理するにはどうすればよいでしょうか?

+2

'os.path.dirname(os.path.abspath(__ file __))'を使ってみましたか? –

+0

@ TheCompilerいいえ、それを試していなかった。私は実際にディレクトリのレベルの違いを処理するために少しそれをハックする必要がありますが、それは間違いなくケースを解決している!これは賢いです!これを答えとして追加することができます。 – zezollo

答えて

5

通常、行うべきことはos.path.dirname(os.path.abspath(__file__))です。

__file__は現在のモジュールへのパスです。os.path.abspathは絶対パスであることを確認し、os.path.dirnameはそのディレクトリ部分を提供します。

モジュールをパッケージの一部として使用していて、たとえばモジュールが必要な場合。パッケージ内のディレクトリであれば、適切な場合はos.path.join(..., os.pardir)を使用するか、可能であればパッケージ(つまり__init__.py)をインポートしてyour_package.__file__を実行します。

また、setuptoolsを使用してデータをパッケージデータとして指定してから、pkg_resources APIを使用してデータにアクセスすることもできます。

関連する問題