相对导入的python打包

2024-04-29 00:11:39 发布

您现在位置:Python中文网/ 问答频道 /正文

首先:对不起,我知道有很多关于进口的问题,但我只是没有找到解决办法。如果可能,我想使用以下目录布局:

myClass/
    __init__.py
    test/
        demo.py
        benchmark.py
        specs.py
    src/
        __init__.py
        myClass.py

现在我的问题是:

  • 包中的测试文件如何正确导入myClass.py?

  • 假设将myClass作为libs/myClass或include/myClass中的子模块,您将如何从外部导入包?

到目前为止,我还没有找到一个优雅的解决方案。根据我的理解Guido's Decision应该可以执行from ..src import myClass,但这将出错:

ValueError: Attempted relative import in non-package

看起来它没有把我的类当作包。Reading the docs

The __init__.py files are required to make Python treat the directories as containing packages;

似乎我遗漏了一些指定包的脚本在哪里的内容,应该使用.pth吗?


Tags: 文件thepytestimportsrc目录init
3条回答

昨晚经过几个小时的搜索,我找到了python中相关导入的答案!!或者至少是一个简单的解决方案。解决此问题的最佳方法是从另一个模块调用模块。所以说您希望demo.py导入myClass.py。在子包根目录下的myClass文件夹中,它们需要一个调用其他两个包的文件。从我收集的信息来看,工作目录总是被认为是__main__,因此如果使用demo.py脚本测试从demo.py导入,您将收到该错误。举例说明:

文件夹层次结构:

myClass/
    main.py #arbitrary name, can be anything
    test/
        __init__.py
        demo.py
    src/
        __init__.py
        myClass.py

我的班级.py:

def randomMaths(x):
    a = x * 2
    y = x * a
    return y

演示.py:

from ..src import myClass

def printer():
    print(myClass.randomMaths(42))

主.py:

import test.demo

demo.printer()

如果在解释器中运行demo.py,将生成错误,但运行main.py不会。这有点复杂,但很有效:D

Intra-package-references描述如何从test/*myClass。要从外部导入包,应在运行导入程序应用程序之前将其路径添加到PYTHONPATH环境变量,或在导入前将其添加到代码中的sys.path列表。

为什么from ..src import myClass失败:可能,src不是python包,您不能从那里导入。您应该将其添加到python path中,如上所述。

ValueError: Attempted relative import in non-package

意味着您试图在非包的模块中使用相对导入。它的问题在于包含此from ... import语句的文件,而不是您试图导入的文件。

因此,如果您在测试中执行相对导入,例如,您应该将测试作为包的一部分。这意味着

  1. __init__.py添加到测试/
  2. 从一些外部脚本运行它们,比如鼻子测试

如果以python myClass/test/demo.py的形式运行某个程序,则相对导入也将不起作用,因为您运行的是演示模块而不是包。相对导入要求使用它们的模块本身被导入为包模块,from myClass.test.demo import blabla,或者使用相对导入。

相关问题 更多 >