无法普遍导入Python包

时间:2012-05-17 14:17:19

标签: python

假设我有以下目录结构:

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

现在,假设我需要访问project_dicts.py中的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_manage?我真的不喜欢它,因为ys_utilsworkspace(以及大约十几个其他软件包)都受版本控制并被其他几个开发人员使用...... {{1}}不是。

2 个答案:

答案 0 :(得分:3)

一般来说,我发现尝试使用相对路径导入危险并且非常容易出错。我建议只在PYTHONPATH上放置工作区(或者在__init__.py中以编程方式添加它)并导入相对于该静态位置的所有内容。这将使您的代码更易于阅读,因为您将能够更快速,更清晰地追踪进口来源。

答案 1 :(得分:1)

尝试使用此代替sys.path.append('..')

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

(你需要导入sys和os)。