即使有__init__.py,python导入仍然失败

1 投票
2 回答
1906 浏览
提问于 2025-04-17 13:37

假设我有这样的目录结构

package /
         __init__.py
         cpackage.py

        subpackage1/
                    __init__.py
                    subpack1_call.py

                    /lib
                        __init__.py
                        sub_lib.py
        subpackage2/
                    __init__.py
                    subpack2_call.py

我想在子包subpackage1和subpackage2中导入cpackage,但我无法导入,出现了值名称错误和模块未找到的错误。

而在subpackage1中,我可以轻松做到这一点。

from lib.sub_lib import hello_pr

hello_pr() 

这里没有错误,hello_pr会打印我在sub_lib中定义的内容,但我无法向上移动目录,而在上面的情况中,我可以轻松向下移动目录结构。

我到底缺少了什么呢?我在这个网站和pydoc上查了很多解决方案,也许我遗漏了什么,因为似乎没有什么能解决我的问题。

2 个回答

1

经过几次阅读和理解你的问题,我觉得你想要的其实是相对导入

from ..cpackage import somename
1

如果你能导入 lib.sub_lib,这说明你的 PYTHONPATH 指向了 subpackage1。PYTHONPATH 应该指向包含这个包的目录,这样你就可以导入 package.cpackage、package.subpackage1.lib.sub_lib 等等。

你也可以把 PYTHONPATH 指向 cpackage,然后把这个目录下的 init.py 文件删掉,因为它没什么用,这样你就可以导入 cpackage、subpackage1.lib.sub_lib 等等。

基本规则是:如果 PYTHONPATH=dir,那么

dir\
  bob.py
  sub\
    __init__.py
    bib.py
    inner\
      __init__.py
      bub.py

import bob
import sub       (will import sub\__init__.py)
import sub.bib   (will import sub\__init__.py then bib.py)
import sub.inner (will import sub\__init__.py then sub\inner\__init__.py)
import sub.inner.bub (will import sub\__init__.py then sub\inner\__init__.py
                      and finally bub.py)

撰写回答