site-packagesにインポートするモジュールとかまとめておくのが使うのがいちばん楽
■何がしたいか
以下のようなGAEOプロジェクトがあります。
ここで、test.controller.forecastareaTest.pyにforecastareaモジュールのテストケースを記述するためには、applicationディレクトリにPYTHONPATHを通す必要があります。
それをいちばんスマートにやるにはどうすればよいかいろいろ悩んでました。
■どうしてそこで悩むの?
forecastareaTest.pyは単体で動作させなくてはいけないからです。
もしここで、jweeklyforecastディレクトリの直下にテストケースをおくことが出来るのであれば、
application_root = os.path.join(os.path.dirname(__file__), 'application') test_root = os.path.join(os.path.dirname(__file__), 'test') sys.path.append(application_root) sys.path.append(test_root) from application.controller import ForecastareaController from test.controller import TestForecastarea
こんな風に自分のディレクトリからのパスをsys.pathに追加してからインポートすれば一発です。applicationもtestも自分の子供ディレクトリですから楽です。
しかしforecastareaTest.pyの位置から見ると・・・
application_root = os.path.join(os.path.dirname(__file__), '../../../application') sys.path.append(application_root) from application.controller import ForecastareaController
こんな風にインポートしなくちゃいけなくなります。相対指定とかする必要があって、ちょっとやな感じです。
PROJECT_HOME = '/User/akisute/DropBox/Projects/GoogleAppEngine/jweeklyforecast/' application_root = os.path.join(PROJECT, 'application') sys.path.append(application_root) from application.controller import ForecastareaController
これでもいいのですが、これだとPROJECT_HOMEが各テストケースごとにべた書きになってしまいます。これまたディレクトリの移動に弱いです。
ディレクトリが動いたらテストケース100件の定数を全部書き直しとか嫌すぎです。
■最終的に出した結論がこれ
site-packagesディレクトリの中にjweeklyforecast_path.pyなる以下のようなモジュールを配置。
#!/usr/bin/env python #encoding: utf-8 import os, sys PROJECT_HOME = '/Users/akisute/Dropbox/Projects/GoogleAppEngine/jweeklyforecast' sys.path.append(PROJECT_HOME) sys.path.append(os.path.join(PROJECT_HOME, 'application'))
そしてこれを各テストケースからインポート。
するとapplicationディレクトリにパスが通るからインポートして使えるという仕組みです。
#!/usr/bin/env python #coding: utf-8 import logging try: import jweeklyforecast_path except Exception, e: logging.warn("jweeklyforecast_path not found.") import unittest from controller.forecastarea import Forecastarea class TestForecastarea(unittest.TestCase): """Forecastarea test case. """ #以下テストケースがずらずらと続く・・・
ディレクトリが動いたり環境が変わったときには、このjweeklyforecast_pathをsite-packagesにコピーして、中身のPROJECT_HOMEを書き直すだけですみます。
■最後になりましたが
意味不明な記事になってしまってごめんなさい。自分の理解度不足ゆえグダグダになってしまいました><