Flask生产部署:setup.py运行时无法导入config.py问题求助
嘿,这个问题我之前部署Flask应用的时候也碰到过!核心原因就是你安装应用后,根目录的config.py根本没被打包到虚拟环境里,Python自然找不到它。
当你跑setup.py install的时候,只有app文件夹里的内容会被安装到虚拟环境的site-packages目录,而根目录的config.py不在find_packages()扫描的范围内,所以完全没被包含进去。接下来给你两个解决办法,优先推荐第一个,更规范:
方案1:把配置文件移到app包里面(最省心)
这是符合Python包结构规范的做法,步骤超简单:
- 把根目录的
config.py直接拖到app文件夹里,现在项目结构变成这样:
├── app │ ├──__init__.py │ ├──config.py # 现在在这里啦 │ ├──forms.py │ ├──models.py │ ├──routes.py │ ├──server.py │ ├──static │ │ └──css │ └──templates │ ├── base.html │ ├── [...] ├──app.py └──setup.py
- 修改
app/__init__.py里的导入语句,从绝对导入改成相对导入:
# 原来的写法 from config import Config # 改成下面这样 from .config import Config
这样改完,config就属于app包的一部分了,安装时会被一起打包到site-packages,Python运行flaskapp命令时就能轻松找到它。
方案2:保留根目录的config.py,修改setup.py打包它
如果你实在不想移动配置文件,那得让setup.py把config.py也装进去,同时调整代码里的导入逻辑:
- 修改
setup.py,添加data_files参数,把config.py安装到和app包同级的目录:
setup( # ... 其他参数保持不变 data_files=[('', ['config.py'])], # ... 剩下的参数也不变 )
- 然后在
app/__init__.py里,得手动把安装目录加到Python的搜索路径里,才能导入config:
import sys import os from flask import Flask # 找到当前app包的目录,再往上一级就是config.py所在的位置 package_dir = os.path.dirname(os.path.abspath(__file__)) root_dir = os.path.dirname(package_dir) sys.path.append(root_dir) from config import Config app = Flask(__name__) app.config.from_object(Config) # ... 其他代码不变
不过这个方案不如第一个省心,不同环境下可能还会有路径问题,所以优先选方案1哈。
顺带提个小bug:server.py里的导入错了
看你的app/server.py里写的是from .app import app,但你的app包里面根本没有app.py啊!app实例是定义在app/__init__.py里的,所以得改成:
# 原来的错误写法 from .app import app # 改成正确的 from . import app
不然等下解决了config的问题,又会碰到No module named 'app.app'的错误。
最后重新跑一遍python setup.py build install && flaskapp,应该就能正常启动啦!
内容的提问来源于stack exchange,提问作者beep
相关产品推荐
相关产品推荐

