如果这个问题以前有人问过,我很抱歉,但我找不到一个明确的答案,每个人的答案似乎给予略有不同,我已经检查了相当数量的文档,但我似乎在这个过程中有点疯狂,现在质疑关于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导入,但它给出了相同的错误。
我非常感谢你在这里免费抽出时间,所以我不期望任何人仔细研究任何东西,但任何帮助都将不胜感激。
1条答案
按热度按时间tzdcorbm1#
如何从目录导入函数、类和其他python文件
什么是导入错误:无法从"countach"导入名称"types"##
1.这可能不是一个循环导入错误,但如果是,您可以在here中找到有关它的详细信息
1.可能是拼写错误
1.尝试导入时使用的结构可能是错误的。
例如:
from dir import file
如您所见,file位于dir2而不是dir中。
我想是第2期了,但是我没有足够的信息。