2016-04-10 21 views
2

TL、このような固定および不変非パッケージのディレクトリ構造についてDRインポート、Pythonの2.7

some_dir/ 
    mod.py 
    test/ 
     test_mod.py 
     example_data.txt 

は非何test_mod.pymod.pyからインポートできるようにするパッケージ方法?

この場合、Python 2.7を使用するように制限されています。

mod.pyに機能のテストをいくつか書きたいと思います。 mod.pyと並んで新しいディレクトリtestを作成したいのですが、そこにはmod.pyから関数をインポートしてテストする1つのテストファイルtest/test_mod.pyがあります。

パッケージベースのネーミングに依存する相対インポートの既知の制限のため、これを簡単に行うことはできません。しかし、トピックに関するすべてのアドバイスは、スクリプトをパッケージとして構築し、相対的なインポートを使用することを示唆しています。これは、私のユースケースでは不可能です。

私の場合、mod.pyはパッケージとしてビルドすることはできません。私はmod.pyのユーザーにインストールする必要はありません。代わりに、バージョンコントロールからファイルをチェックするだけで自由に使用でき、使いたいと思っても使い始めることができます。その状況を変更することはできません。

これを考えると、簡単でわかりやすい方法を教えてください。test

注:mod.pyと一緒に座っているないだけでテストファイルが、他のそれに付属するテストデータなどの資産、およびサブディレクトリの組織が存在しますので、実際のテストディレクトリが重要です。

これは重複していますが、投稿前に私の研究で見たこの質問のダースまたはそれ以上の並べ替えのうち、私はお詫び申し上げます。彼らはすべて私の場合のための許容されるオプションではないパッケージングを使用すると言う。

+0

もっとも洗練された解決策ではないかもしれませんが、テストランナーのために 'PYTHONPATH'を修正することができます。 。 。 – mgilson

答えて

1

@mgilsonのコメントに基づいて、ファイルimport_helper.pyをテストディレクトリに追加しました。ここで

some_dir/ 
    mod.py 
    test/ 
     test_mod.py 
     import_helper.py 
     example_data.txt 

import_helper.pyの内容です:

import sys as _sys 
import os.path as _ospath 
import inspect as _inspect 
from contextlib import contextmanager as _contextmanager 

@_contextmanager 
def enable_parent_import(): 
    path_appended = False 
    try: 
     current_file  = _inspect.getfile(_inspect.currentframe()) 
     current_directory = _ospath.dirname(_ospath.abspath(current_file)) 
     parent_directory = _ospath.dirname(current_directory) 
     _sys.path.insert(0, parent_directory) 
     path_appended = True 
     yield 
    finally: 
     if path_appended: 
      _sys.path.pop(0) 

、その後test_mod.pyのインポートセクションでは、前mod.pyをインポートしようとする試みに、私が追加しました:

import unittest 
from import_helper import enable_parent_import 

with enable_parent_import(): 
    from mod import some_mod_function_to_test 

それをPYTHONPATHを手作業でmangleする必要があるのは残念ですが、コンテキストマネージャーとして書くのは少し役に立ちます。sys.pathをそのoに戻します親ディレクトリの変更前の厳格な状態。

この問題を複数のインスタンスにまたがるように調整するには(明日、私はwidget.pyというモジュールをいくつか無関係なタスク用に作成し、パッケージとして配布することはできません)、ヘルパー関数そのコピーが何らかのテストで配布されていることを確認するか、その小さなユーティリティをパッケージとして作成し、ユーザーベースにグローバルにインストールされていることを確認してください。

企業内の多くのPythonコードを管理すると、しばしば機能しないコード配布モードが発生することがあります。これは、Pythonコードの「インストール」がバージョン管理から新しいバージョンをチェックアウトすることと同じです。

コードは非常にローカライズされており、大規模なチームの小さなサブセットの小さな一連のタスクに特化していることが多いため、パッケージ化によるコード共有のオーバーヘッドを維持することが一般的には良い考えです起こる。

結果として、私は上記のユースケースが実世界のPythonでは非常に一般的であると感じています.PYTHONPATHを変更するためにこの機能を追加したインポートツールがあればいいと思います。ディレクトリ)は非常に簡単です。

これは、少なくとも標準ライブラリの一部であり、独自のコードをロールしたり、テストに同梱されたり、ユーザーベースにインストールされたりする必要はありません。

関連する問題