如何在Python包中使用相对导入,尤其是在pytest中?

q5lcpyga  于 2023-02-28  发布在  Python
关注(0)|答案(1)|浏览(92)

如果这个问题以前有人问过,我很抱歉,但我找不到一个明确的答案,每个人的答案似乎给予略有不同,我已经检查了相当数量的文档,但我似乎在这个过程中有点疯狂,现在质疑关于python导入的基本事实。
我做过几个Python包,但我总是很难让导入工作,我的正常项目结构(如Python packaging user guide中所示)如下:

packageName/
    src/
        packageName/
            __init__.py
            file1.py
            file2.py
        tests/
            test_file1.py
            test_file2.py
            testData/
                data_for_tests.py

目前,当我想在file1.py中使用file2.py中的函数时,我会使用from .file2 import functionName,但这看起来非常笨拙和不优雅,并且消除了将东西抽象到文件后面的许多好处。我也读过很多文档,这些文档说这些相对导入被认为是有害的。
我试过只使用import packageName.file2,但是当我运行pytest时,它告诉我不存在这样的包。我能想到的唯一解决方法是设置一个脚本将其构建成一个wheel,并首先在本地安装它,但这似乎不是特别优雅。作为参考,当我运行pytest时,我从包的根目录运行python3 -m pytest
另外,当我想让一个函数(比如file1)作为packageName.function使用时,我把from file1 import function放到init文件中,这看起来不错,但是对于所有其他的东西,我想知道这是否是正确的方法。
我和很多使用Python的工程师一起工作,但他们都没有制作pip上的包,而这里似乎是寻找答案的最佳场所。

编辑以添加我的特定案例:

在Blue Robin的建议下,我尝试只使用from packageName import file2,它只在一个文件上工作,但在使用其他文件时不工作(尽管我确信这不是循环依赖问题)。作为一个更具体的例子,下面是我目前正在工作的项目:

countach/
    src/
        countach/
            __init__.py
           fileops.py     | (no imports)
           fixed.py       | (no imports)
           processing.py  | (imports fileops and types)
           types.py       | (imports fixed)

我把from .fileops import _function换成了from countach import fileops,它工作了(删除给定函数中的下划线)然后我尝试了其他导入,但它们不起作用,并给出了错误ImportError: cannot import name 'types' from 'countach'(或fixed的相同类型的错误)。谷歌这些错误表明它们通常发生在循环依赖中,但实际情况并非如此,因为fixed不导入任何内容,我甚至尝试从同一目录中的python3 REPL导入,但它给出了相同的错误。
我非常感谢你在这里免费抽出时间,所以我不期望任何人仔细研究任何东西,但任何帮助都将不胜感激。

tzdcorbm

tzdcorbm1#

如何从目录导入函数、类和其他python文件

from directory import file  # file is the .py file name within the directory
from file import class  # You can replace class with any function or class in the py file

什么是导入错误:无法从"countach"导入名称"types"##

1.这可能不是一个循环导入错误,但如果是,您可以在here中找到有关它的详细信息
1.可能是拼写错误
1.尝试导入时使用的结构可能是错误的。
例如:from dir import file

File structure:
dir-
-- file1
dir2-
--file

如您所见,file位于dir2而不是dir中。
我想是第2期了,但是我没有足够的信息。

相关问题