Python子包引用

0 投票
2 回答
1591 浏览
提问于 2025-04-15 19:46

我快要抓狂了,因为这个问题本来应该很简单。让我给你讲讲我写的一个简单例子,试图解决我的问题。我有一个名为 top 的文件夹,在它的 __init__.py 文件里写了 __all__ = ["p1","p2"]。然后,我在里面有两个子文件夹 p1 和 p2,每个文件夹里都有一个 __init__.py 文件,里面同样定义了 __all__,内容是两个简单模块 quick1 和 quick2,quick1 在 p1 里,quick2 在 p2 里。当我从 top 之外的脚本中导入 top.p1.quick1 时,一切正常。但是,当我尝试从 quick2 导入 top.p1.quick1 时,就出现了错误: File "quick1.py", line 1, in <module> import top.p2.quick2 ImportError: No module named top.p2.quick2 我该如何从一个子包中导入另一个子包的模块呢?根据我所了解的 Python 文档,这应该是可以的。有没有人能看到我犯的明显错误?

补充:看起来我需要把包含 top 的目录添加到我的搜索路径中。我可以通过设置 PYTHONPATH 临时做到这一点。不过,有没有更好的方法可以通过 distutils 脚本来实现呢?

2 个回答

3

你的问题是,你的顶层包不在你的系统路径里。

2

你描述的情况都没问题,并没有引发错误——这是我能想到的最简单的版本:

$ mkdir /tmp/path
$ mkdir /tmp/path/top /tmp/path/top/p1 /tmp/path/top/p2
$ touch /tmp/path/top/__init__.py /tmp/path/top/p1/__init__.py /tmp/path/top/p2/__init__.py
$ touch /tmp/path/top/p1/quick1.py /tmp/path/top/p2/quick2.py$ echo 'import top.p1.quick1' > /tmp/path/top/p2/quick2.py
$ PYTHONPATH=/tmp/path python /tmp/path/top/p2/quick2.py
$ python -c 'import sys; sys.path.append("/tmp/path"); import top.p2.quick2'

这个代码运行得很好。__all__ 这个东西并不重要,除非你在用 from ... import *,但你并没有这样做(你这样做是对的)。只要 top 的父目录(在这里是 /tmp/path)在 sys.path 里,一切都会正常;如果那个父目录不在里面,你就会遇到错误。

那么,你能对这个操作顺序做出什么最小的改动,以重现你看到的错误呢?

撰写回答