Py学习  »  Python

python无法从包中导入模块

gigamarr • 6 年前 • 1721 次点击  

我有一个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 我有一些类的方法可以获取一些数据,我将这些类导入到 Fo/Mn.Py 返回json响应

课堂 foo/utilities.py文件 还使用了 普通/util.py 但是当我试图从 普通/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社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/42982
文章 [ 1 ]  |  最新文章 6 年前
phd
Reply   •   1 楼
phd    6 年前

从common.util导入我的函数

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

from.common.util导入我的函数

此导入需要 common 成为 foo 但事实并非如此。

从myproject.common.util导入my_func

这最终是最好的方法,但是对于它来说 myproject/ 子目录必须在 搜索路径 . 要么你安装整个 myproject 或将父目录添加到 $PYTHONPATH 环境变量或将目录添加到 搜索路径 在里面 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/parentdir 是目录中 MyPosits 是。

安装后 我的计划 或将其父目录添加到 搜索路径 也可以使用相对导入。你要记住 常见的 是与 所以进口一定不是来自 .common 但来自 ..common :

from ..common.util import my_func