在Python3.10中如何从兄弟目录导入模块。

6

已经有10多篇关于这个问题的SO帖子,但是没有一个答案适用于我,我仍然没有看到有人从兄弟目录中导入东西的示例。

src
    __init__.py
    test.py
    package1
        __init__.py
        module1.py
    package2
        __init__.py
        module2.py

在 Python 版本大于 3.3 的情况下,init.py 不是必需的,但我仍然将其放在那里,因为它们没有任何区别。

在 test.py 中,我有以下内容:

import package1.module2

我的代码运行良好,但是问题在于当我想要从包2导入一些东西到包1中,或者反过来时就会出现问题。我在module2.py中尝试了不同的导入方法,但是我收到了这些不同的错误消息:

import src.package1.module1.py

出现错误:

ModuleNotFoundError: No module named 'src'

并且

from .. import package1

伴随着错误:

ImportError: attempted relative import with no known parent package

这里的最佳答案:如何从兄弟目录导入Python脚本?与我上面显示的确切错误消息相同。
这里的答案:如何从兄弟文件夹导入Python模块?没有改变任何内容。
我是否漏掉了什么或者在不同的文件夹/包之间导入东西是不可能的? 我需要使用“sys.path hack”吗?

你是如何运行你的代码的? - Brian61354270
1
这个回答解决了你的问题吗?相对导入,又一次 - Brian61354270
我猜...这并不是一个解决方案,但它解释了为什么不能以这种方式组织我的代码。据我所知,我无法直接在使用另一个子目录中的内容的子目录中运行脚本。 - lapurita
1
是的和不是。目录和子目录对Python来说毫无意义。Python只关心模块和包,这些模块和包仅在Python路径上搜索。您可以在包内的任何位置运行模块,但需要记住告诉Python该模块位于包的哪个位置/要导入的包位于哪里。 - Brian61354270
2个回答

2

我尝试了几乎所有类似问题的解决方案,但都没有起作用! 然而,在我不断地碰壁之后,我发现只需删除一个点,这个解决方案就可以奏效:

import sys
sys.path.append('..')

只需在append方法中从字符串中删除一个点,即:

sys.path.append('.')

或者你可以使用:
sys.path.insert(0, '.')

接下来,您可以从兄弟文件夹导入任何模块。我使用Python 3.9.13尝试过,并且效果很好。


0

我刚刚花了几个小时苦苦挣扎,尝试了来自相关问题答案的各种解决方案,但都没有奏效。只有当我清理了各种失败尝试中的垃圾并尝试了愚蠢简单的解决方案from package1 import module1(注意没有点,即不是相对导入),它才起作用!

请注意,您的IDE可能会对此发出警告(在我的当前主要项目中,PyCharm会发出警告,但在我创建的一个独立测试项目中则不会)。尽管如此,当您运行代码时,它应该可以工作(在Windows 11上测试过Python 3.10)。


我已经在https://github.com/tok3rat0r/dummyProj上添加了一个包含最小工作示例的git仓库。 - tok3rat0r
1
或者您可以使用我的库 https://github.com/ronny-rentner/ultraimport,它可以让您更好地控制导入,并允许从任何目录进行基于文件系统的导入。 - user19322455

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接