如何从兄弟文件夹中导入Python模块?

69

我看过许多与Python相对导入相关的问题,但我无法理解这个问题/使其正常工作。

我的目录结构如下:

Driver.py

A/
      Account.py
      __init__.py

B/
      Test.py
      __init__.py

驱动程序.py

from B import Test

账户.py

class Account:
def __init__(self):
    self.money = 0

测试.py

from ..A import Account

当我尝试运行时:

python Driver.py

我遇到了错误

Traceback (most recent call last):

from B import Test

File "B/Test.py", line 1, in <module> from ..A import Account

ValueError: Attempted relative import beyond toplevel package

5
询问关于在不同版本之间发生了根本变化的功能时(如相对导入、Unicode等),您应该提及您使用的Python版本。有时人们可以根据您收到的特定错误或编写代码的方式猜测出版本,但您不应该指望人们能够猜对。请注意,在提问中注明Python版本是很重要的。 - abarnert
试试这个答案,对我有效。 - Hadi F
3个回答

39
这是因为在Python中,AB被视为独立无关的包。请在与Driver.py相同的目录下创建一个__init__.py文件,这样一切都应该按预期工作。

1
谢谢!你能解释一下 init.py 文件吗?我没有理解在网上找到的解释。我来自 C++ 背景,所以习惯于只给出包含文件的路径等信息。 - Joshua
15
有点模糊,但基本上是这样的:在一个目录中放置一个__init__.py文件意味着“在该目录下,所有.py文件以及包含__init__.py文件的子目录都属于同一个包”。 - David Wolever
2
这个解决方案在我使用Python 2.7.14时不起作用。我猜这个解决方案是针对Python 3.x的?那么,对于被迫在旧系统中工作的人来说,有没有Python2的解决方案呢? - retsigam
54
我创建了一个 __init__.py 文件,但仍然收到相同的错误。我使用的是 Python 3.7 版本。为什么会这样? - Jared Nielsen
我使用3.6.8版本,需要Test.pyA模块中导入account。然后,我可以从包含目录调用Driver.py - smcs
显示剩余4条评论

16
在我的情况下,添加__init__.py是不够的。如果出现模块找不到的错误,您还需要添加父目录的路径。

在我的情况下,添加__init__.py是不够的。如果出现模块找不到的错误,您还需要添加父目录的路径。

root :
 |
 |__SiblingA:
 |    \__A.py
 |     
 |__SiblingB:
 |      \_ __init__.py
 |      \__B.py
 |

要从A.py导入B.py,你需要按照以下步骤进行

import sys
  
# append the path of the parent directory
sys.path.append("..")

from SiblingB import B
print("B is successfully imported!")

2
这对我来说在2022年8月运行得最好。这应该是被接受的答案!被接受的答案没有提供完整的目录结构和代码以使其工作。 - Rich Lysakowski PhD
1
它对我不起作用。但是只有一个点“sys.path.append(“。”)”就可以工作。 - alfredo

1

原因是

ValueError: Attempted relative import beyond toplevel package

这意味着ADriver.py在同一目录级别。因此,..Afrom ..A import Account中是超出顶级包的。

您可以通过创建一个名为AandB的新文件夹以及在该新文件夹中添加__init__py来解决此问题,然后将AB文件夹移动到AandB文件夹中。目录结构如下:

The directory structure

相应地,Driver.py 中的内容应该修改为 from AandB.B import Test


这应该是被接受的答案,而且不需要调用 sys.path.append("..") - undefined

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