在 Python3 中具有相对导入的 ImportError [重复]

Posted

技术标签:

【中文标题】在 Python3 中具有相对导入的 ImportError [重复]【英文标题】:ImportError with relative import in Python3 [duplicate] 【发布时间】:2021-12-07 16:41:04 【问题描述】:

这是我的目录结构:

python
 -main
  -api
   -__init__.py
 -tests
 -__init__.py
 -wsgi.py

wsgi 包含以下代码:

from .main import api


app = api.create_app()

if __name__ == '__main__':
    app.run(port=8080)

但是,当我尝试运行代码时,出现以下错误:

 Traceback (most recent call last):   File
 "/Users/unbp/projects/webservices/fund-distribution.webservice/python/wsgi.py",
 line 1, in <module>
     from .main import api ImportError: attempted relative import with no known parent package

父文件夹'python'确实包含__init__.py文件,所以它是一个包,不是吗? 它适用于from main import api(主前面没有点) 我哪里错了?

【问题讨论】:

这能回答你的问题吗? Relative imports for the billionth time main 文件夹不包含 init.py 如果它在 python 路径上,它就是一个包。您可以在“python”目录上方 cd,现在“python”是包。你可以编写一个 setup.py 并使这个东西可以安装。 Python 遵循与 C 程序相同的模型。 PATH(python 脚本)中的可执行文件和库路径中的共享模块。 【参考方案1】:

我还是 python 新手,所以请谨慎对待, 做的时候:

from [filename/module/library/etc] import [something]

您正在导入库的特定部分,这是该行中的第一个调用(所以 .main)

app = api.create_app()

将“api”视为库,并将“create_app()”作为“api”模块中的函数调用。

如果 api 是库,则改为:

import api

如果 create_app() 是函数并且 api 是您的库,它应该可以工作

from api import create_app()

app = create_app()

if __name__ == '__main__':
    app.run(port=8080)

您不再需要指定该文件,因为您已经声明了它并且可以调用该函数,就好像它已经写入您的脚本一样。 我希望我没有搞砸我的术语,但这应该可以解决您的问题。

编辑*** 我意识到我读错了你原来的帖子, 您不能以您尝试的方式调用文件夹,我上面写的应该解释为什么这就是我不删除它的原因。

要解决你的问题,你需要调整你的路径,做

import sys
sys.path.insert(0, 'api')

from _init_ import create_app()

app = create_app()

if __name__ == '__main__':
    app.run(port=8080)

这样做是使用 sys 模块将路径附加到文件夹,以便解释器能够找到您要引用的文件并调用该函数。

【讨论】:

以上是关于在 Python3 中具有相对导入的 ImportError [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在python3中正确导入同一目录下的模块

py3相对import和mock的问题

python3绝对路径,相对路径

Python2 和Python3 的差异总结

如何在 Python3 中使用带有 if __name__='__main__' 块的相对导入?

Python3 第五周大纲(模块,导入方法import本质,导入优化,模块的分类)