来自兄弟文件夹的Python导入模块

Jos*_*hua 35 python import module relative-path

我已经经历了许多Python相关的导入问题,但我无法理解这个问题/让它工作......

我的目录结构是:

Driver.py

A/
      Account.py
      __init__.py

B/
      Test.py
      __init__.py
Run Code Online (Sandbox Code Playgroud)

====================

Driver.py

from B import Test
Run Code Online (Sandbox Code Playgroud)

=========

Account.py

class Account:
def __init__(self):
    self.money = 0
Run Code Online (Sandbox Code Playgroud)

====================

Test.py

from ..A import Account
Run Code Online (Sandbox Code Playgroud)

==================

当我试图跑

python Driver.py

我收到了错误

Traceback(最近一次调用最后一次):

来自B进口测试

Driver.py从..A导入帐户输入"B/Test.py",第1行

ValueError:尝试相对导入超出toplevel包

Dav*_*ver 21

这种情况正在发生,因为就Python而言A,B它们是独立的,无关的软件包.

__init__.py在同一目录中创建一个,Driver.py并且一切都应该按预期工作.

  • 它有点手工波浪,但基本上是:在目录中放置一个`__init __.py`文件意味着"在这个目录中,所有`.py`文件,以及包含`__init __.py`文件的所有子目录,是同一个包的一部分". (13认同)
  • 我创建了一个__init__.py,但仍然遇到相同的错误。我使用的是Python 3.7。是什么赋予了? (13认同)
  • 该解决方案不适用于使用 Python 2.7.14 的我。我认为解决方案适用于 Python 3.x?对于那些被迫在遗留系统中工作的人来说,有 python2 解决方案吗? (2认同)

She*_*har 6

在我的情况下,添加__init__.py是不够的。如果您收到模块未找到错误,您还必须附加父目录的路径。

root :
 |
 |__SiblingA:
 |    \__A.py
 |     
 |__SiblingB:
 |      \_ __init__.py
 |      \__B.py
 |
Run Code Online (Sandbox Code Playgroud)

要从 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!")
Run Code Online (Sandbox Code Playgroud)

  • 这在 2022 年 8 月对我来说效果最好。这应该是公认的答案!接受的答案没有提供完整的目录结构和代码以使其工作。 (3认同)
  • 它对我不起作用。但仅适用于一个点 `sys.path.append(".")` (2认同)

归档时间:

查看次数:

23344 次

最近记录:

5 年,12 月 前