假设我有以下目录结构:
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_utils
和workspace
(以及大约十几个其他软件包)都受版本控制并被其他几个开发人员使用...... {{1}}不是。
答案 0 :(得分:3)
一般来说,我发现尝试使用相对路径导入危险并且非常容易出错。我建议只在PYTHONPATH上放置工作区(或者在__init__.py
中以编程方式添加它)并导入相对于该静态位置的所有内容。这将使您的代码更易于阅读,因为您将能够更快速,更清晰地追踪进口来源。
答案 1 :(得分:1)
尝试使用此代替sys.path.append('..')
:
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
(你需要导入sys和os)。