Python无法从packag导入模块

2024-06-17 12:57:16 发布

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

我有一个flask restful项目,其布局如下(为方便起见,文件名已更改)

myproject/
    __init__.py
    app.py
    common/
        __init__.py
        util.py
    foo/
        __init__.py
        main.py
        utilities.py

foo/只是一个包含其中一个API端点的代码的文件夹,我计划在将来添加其他的,因此我有一个{}文件,其中包含我将与其他API端点一起使用的可重用函数。在

foo/main.py

^{pr2}$

返回类的

foo/utilities.py中的类也使用了common/util.py中的一些函数,但是当我试图从common/util.py导入到{}时,我得到import common.util ModuleNotFoundError: No module named 'common'

是什么引起的?我尝试了多种导入方式: from common.util import my_funcfrom .common.util import my_funcfrom myproject.common.util import my_func

但都没用。在

这是myproject/app.py,以防有问题:

from flask import Flask
from flask_restful import Api

from foo.main import Foo

app = Flask(__name__)
api = Api(app)

api.add_resource(Foo, '/Foo')

if __name__ == "__main__":
    app.run()

如果重要的话,我会用激活的virtualenv来做这些


Tags: frompyimportrestfulappflaskfooinit
1条回答
网友
1楼 · 发布于 2024-06-17 12:57:16

from common.util import my_func

在python3中,这是一个绝对的导入,即带有common/子目录的目录必须在sys.path中。在你的情况下,这肯定是个错误的做法。在

from .common.util import my_func

此导入要求commonfoo的子目录,但实际情况并非如此。在

from myproject.common.util import my_func

最后,这是最好的方法,但要使其工作,myproject/子目录的父目录必须在sys.path中。要么安装整个myproject,要么将父目录添加到$PYTHONPATH环境变量中,要么将目录添加到foo/main.py中的sys.path。比如:

PYTHONPATH=/home/to/parentdir /home/to/parentdir/myproject/foo/main.py

或者

^{pr2}$

/home/to/parentdirmyproject/所在的目录。在

安装myproject或将其父目录添加到sys.path之后,还可以使用相对导入。您需要记住,common是与foo相比的同级包,因此导入必须不是来自.common,而是来自{}:

from ..common.util import my_func

相关问题 更多 >