2

假设我有以下目录结构:

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

现在,假设我需要访问project_dicts.pyin manage.py。另外,我的$PATH包括/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.py,以便它可以manage.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_manageys_utils(以及大约十几个其他包)都处于修订控制之下并被其他几个开发人员使用......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 回答