3


2

私はこのディレクトリ構造とこれらのファイルを使ったpythonプロジェクトを持っています。

/ home / project_root
|---__init__.py
|---setup
| ---__ init__.py | --- configs.py
|---test_code
| ---__ init__.py | --- tester.py

テスタースクリプトはsetup / configs.pyから参照 "setup.configs"を使ってインポートします。 私の開発マシンではうまく動きます。

これは開発用(Linux)コンピュータ上で動作します。 これを別の(Linux)コンピュータに移動するときは、PYTHONPATHを次のように設定します。

PYTHONPATH = "/ home / project_root"

しかし、私がtester.pyを実行すると、configsモジュールが見つかりません。 そして私が対話的なPythonインタプリタを実行するとき、sys.pathは/ home / project_rootディレクトリを含みません。 しかし、$ PYTHPATHをエコーすると/ home / project_rootが表示されます。

私はここで何をしていますか?

(私はターゲットマシンのPYTHONPATHを設定するために.bashrcファイルに頼りたくありません - コードはDjangoアプリケーション用で、最終的にはwww-dataによって実行されます。 そして、私はDjangoのためのapacheの設定がPYTHONPATHの仕様を含んでいることを知っています、しかし私はコードがターゲットマシン環境でその単体テストに合格することを確かめようとしているのでここでそれを使いたくありません。

  • CURIOUSERとCURIOUSER *これはユーザーIDとパーミッションの問題のようです。 - 一般ユーザからのコマンドで起動した場合、インタプリタは期待どおりにモジュールをインポートできます。 - sudoで起動したとき(私はここでUbuntuを実行しています)、インタプリタは期待どおりにモジュールをインポートできません。

    • ファイルはwww-dataによって所有されているので、私はsudoでテストスクリプトを呼び出しています(b / cそれらはDjangoアプリケーションの一部としてapacheを実行しているユーザーによって呼び出されます)。 - ファイルの所有権を通常のユーザーの所有権に変更した後、テストスクリプトはインポートエラーなしで実行されます(ただし、あらゆる種類のユーザーID関連の壁に適用されます)。

あなたの時間を無駄にしてすみません。 この質問は締め切られるべきです。

3 回答


4


`import setup.configs`の直前のテスタースクリプトにこれを貼り付けてください。

import sys import os sys.path.insert(0、os.path.join(os.path.dirname(__ file__)、os.path.pardir))

`sys.path`はpythonインタプリタがpythonモジュールをインポートするときに探す全てのディレクトリのリストです。 これは、セットアップモジュールを含む親ディレクトリをそのリストの先頭に追加します。つまり、ローカルディレクトリが最初にチェックされます。 あなたのモジュールがシステム全体にインストールされているなら、それは重要です。 それに関するより詳しい情報はここにあります: sys doc

編集: .pthファイルは `/ usr / local / lib / python2.X / site-packages /`に置くこともできます。検索します。 この行を含むファイルを追加するだけです。

/ home / project_root


0


Pythonのパスを自分のスクリプトに明示的に設定してみてください。 変更したくない場合は、テスターのパスに常に "../"のようなものを追加できます。 つまり、

sys.path.append( "../")


0


(ターゲットマシンにPYTHONPATHを設定するために.bashrcファイルに頼らないでください - コードはDjangoアプリケーション用であり、最終的にはwww-dataで実行されます。 そして、DjangoのApache設定にはPYTHONPATHの指定が含まれていることを知っていますが、ここではそれを使用したくないので、最初にコードがターゲットマシン環境でユニットテストに合格するようにします。

コードがDjangoアプリケーション用のものであれば、Djangoプロジェクトのコンテキストでテストしない理由はありますか? Djangoプロジェクトのコンテキストでそれをテストすることには、いくつかの利点があります。

  1. Djangoの manage.py`はあなたのためにあなたのPython環境をセットアップします。 適切なプロジェクトパスを `sys.path`に追加し、環境変数 DJANGO_SETTINGS_MODULE`を正しく設定します。

  2. Djangoのライブラリには十分な単体テスト機能が含まれているので、自分のテスト機能を含めるようにその機能を簡単に拡張できます。 Djangoプロジェクトでテストを実行するのは、 `manage.py`を介して単一のコマンドを実行するのと同じくらい簡単です。