Python 无法从包中导入模块

2024-03-01

我有一个具有以下布局的 Flask Restful 项目(为方便起见更改了文件名)

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

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

foo/main.py

from flask_restful import Resource, request

from utilities import Analysis

class Foo(Resource):
    def get(self):      
        pass

in foo/utilities.py我有一些带有获取一些数据的方法的类,我将这些类导入到foo/main.py返回 JSON 响应

班级在foo/utilities.py还使用了一些函数common/util.py但是当我尝试从中导入一些东西时common/util.py to foo/utilities.py I get import common.util ModuleNotFoundError: No module named 'common'

可能是什么原因造成的?我尝试了多种导入方式:from common.util import my_func from .common.util import my_func from myproject.common.util import my_func

但没有一个起作用。

This is 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 中执行所有这些操作


从 common.util 导入 my_func

在 Python 3 中,这是绝对导入,即带有以下内容的目录common/子目录必须位于sys.path。在你的情况下,这肯定是一个错误的方法。

从 .common.util 导入 my_func

此次进口预计common成为以下目录的子目录foo但事实并非如此。

从 myproject.common.util 导入 my_func

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

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

or

import sys
sys.path.insert(0, '/home/to/parentdir')

/home/to/parentdir是目录myproject/ is.

安装后myproject或将其父目录添加到sys.path您还可以使用相对导入。你需要记住这一点common是一个兄弟包相比foo所以进口一定不是来自.common但从..common:

from ..common.util import my_func
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 无法从包中导入模块 的相关文章

随机推荐