假设我有以下目录结构:
workspace/
__init__.py
ys_manage/
__init__.py
manage.py
ys_utils/
__init__.py
project_dicts.py
现在,假设我需要访问 manage.py
中的 project_dicts.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
(以及大约十几个其他包)都在版本控制下并被其他几个开发人员使用...工作区
不是。
最佳答案
一般来说,我发现尝试使用相对路径进行导入很危险并且很容易出错。我建议只将工作区放在 PYTHONPATH 上(或以编程方式将其添加到 __init__.py
中)并导入与该静态位置相关的所有内容。它还将使您的代码更易于阅读,因为您将能够更快、更清楚地跟踪导入的来源。
关于python - 无法通用导入Python包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10637458/