【发布时间】:2019-07-31 11:13:42
【问题描述】:
我有一个带有以下布局的烧瓶宁静项目(为方便起见更改了文件名)
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 版本? Py2 和 Py3 对隐式相对导入有不同的规则。
-
@phd 我正在使用 python 3
-
你安装
myproject了吗?或者您只是将foo/main作为脚本运行而无需安装?在后一种情况下,myproject在sys.path中不可用,只有目录foo可用,而且它不是包,因此您不能使用相对导入。 -
安装是什么意思?我不运行
foo/main.py我运行myproject/app.py来运行整个API,它运行良好,但common.util的导入在foo/utilities.py中失败,为了测试它我运行foo/utilities.py,我得到了我写的错误以上 -
通过运行
python setup.py install或pip install将myproject的副本放入当前Python 的site-packages/目录(或任何已经在sys.path中的目录)。当然你必须有setup.py。
标签: python module package virtualenv flask-restful