我有一个带有以下布局的烧瓶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中做所有这些
来自common.util import my_func
在Python 3中,这是绝对导入,也就是说,common/
子目录的目录必须在sys.path
中。在你的情况下,这肯定是一个错误的方法。
来自.common.util import my_func
这个导入期望common
是foo
的子目录,但事实并非如此。
来自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/parentdir
是myproject/
所在的目录。
安装myproject
或将其父目录添加到sys.path
后,您还可以使用相对导入。你需要记住common
是一个与foo
相比的兄弟包,所以导入必须不是来自.common
而是来自..common
:
from ..common.util import my_func