Python无法从包中导入模块

时间:2019-03-09 17:07:44

标签: python module package virtualenv flask-restful

我有一个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

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中进行所有操作

1 个答案:

答案 0 :(得分:1)

  

从common.util导入my_func

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

  

从.common.util导入my_func

此导入期望commonfoo的子目录,

  

从myproject.common.util导入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