Python无法从包中导入模块

问题描述 投票:0回答:1

我有一个带有以下布局的烧瓶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

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

foo/utilities.py中的类也使用来自common/util.py的一些函数但是当我尝试从common/util.py导入到foo/utilities.py时,我得到了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

但都没有用。

如果重要的话,这是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中做所有这些

python module package virtualenv flask-restful
1个回答
1
投票

来自common.util import my_func

在Python 3中,这是绝对导入,也就是说,common/子目录的目录必须在sys.path中。在你的情况下,这肯定是一个错误的方法。

来自.common.util import my_func

这个导入期望commonfoo的子目录,但事实并非如此。

来自myproject.common.util import my_func

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

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

要么

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

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

安装myproject或将其父目录添加到sys.path后,您还可以使用相对导入。你需要记住common是一个与foo相比的兄弟包,所以导入必须不是来自.common而是来自..common

from ..common.util import my_func
© www.soinside.com 2019 - 2024. All rights reserved.