2

次のディレクトリ構造があるとします。

workspace/
  __init__.py
  ys_manage/
    __init__.py
    manage.py
  ys_utils/
    __init__.py
    project_dicts.py

project_dicts.pyここで、 in にアクセスする必要があるとしmanage.pyます。また、私の$PATHinclude /home/rico/workspace/ys_manage.

manage.pyマシン上の任意のディレクトリから実行できる必要があり、アクセスできる必要がありますproject_dicts.py

$PYTHONPATHだけが持ってい/home/rico/workspaceます。

以下を含めるとmanage.py、ファイルを実行できますが、他の場所からは実行でき~/workspace/ys_manageません。

import sys
sys.path.append('..')
from ys_utils import project_dicts

'..'、ファイルが置かれている場所ではなく、ファイルが実行されているディレクトリへの相対パスを与えるようです。これは正しいです?

普遍的に利用できるように、ys_manage/__init__.pyインポートして使用したかったのです。これは良い考えですか?project_dicts.pymanage.py

__init__.py「パッケージクリエーター」以外に使用したことはありません。つまり、初期化の目的で使用したことはありません。おそらく私はそれを間違っています。

の内容ys_manage/__init__.py:

import sys
sys.path.append('..')
from ys_utils import project_dicts

manage.pyこのインポートを探すために何かを含める必要がありますか?

実行しようとするmanage.pyと、次のエラーが表示されます。

NameError: global name 'project_dicts' is not defined

二次的な質問として、私は持っている必要がありworkspace/__init__.pyますか? ys_manageand ys_utils(および他の約 12 個のパッケージ) はすべてリビジョン管理下にあり、他のいくつかの開発者によって使用されているため、私は本当にそれを持っていません...workspaceそうではありません。

4

2 に答える 2

3

一般的に、インポートに相対パスを使用しようとすると、危険でエラーが発生しやすくなります。ワークスペースをPYTHONPATHに配置して(またはプログラムでに追加して__init__.py)、その静的な場所に関連するすべてのものをインポートすることをお勧めします。インポートがどこから来ているのかをはるかに迅速かつ明確に追跡できるため、コードも読みやすくなります。

于 2012-05-17T14:25:33.153 に答える
1

代わりにこれを試してくださいsys.path.append('..')

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

(sys と os の両方をインポートする必要があります)。

于 2012-05-17T14:29:12.840 に答える