在 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 timemain
文件夹不包含 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章