命令行执行.py文件通过flask-script初始化数据库提示ModuleNotFoundError: No module named 'XXX' 解决方法

本文详细介绍了在使用Flask框架进行项目开发时,遇到的模块导入错误问题及其解决方案。通过调整环境变量path,确保了在命令行环境下能够正确导入项目模块,避免了ImportError的发生。

项目中需要初始化数据库等操作,我用了flask-script的manage类来完成,所以按照标准的demo样式单独写了manage .py,来执行部署后的初始化工作,先看我的项目结构:
项目结构树

代码如下:

# -*- coding:utf-8 -*-
from flask import Flask
from flaskdemo.db import db
from flask_script import Manager, prompt_bool
from flaskdemo.config import SQLConfig

app = Flask(__name__)
manage = Manager(app)
app.config.from_object(SQLConfig)
db.init_app(app)


@manage.option('-d', '-drop', dest='drop', default='no')
def initdb(drop):
    """Initialize the database."""
    if drop == 'yes':
        if prompt_bool("Are you sure you want to lose all your data?"):
            db.drop_all()
            print('drop tables done.')
    db.create_all()
    print('Initialized database.')


if __name__ == '__main__':
    manage.run()

然后在Teminal中切换到项目目录后执行:

>>> cd flaskdemo
>>> python manage.py initdb

直接报错:

Traceback (most recent call last):
  File "manage.py", line 8, in <module>
    from flaskdemo.db import db
ModuleNotFoundError: No module named 'flaskdemo'

明明就有这个文件,可是死活就import失败,在pytharm上执行都是OK的,所以怀疑是目录问题,因为我项目主文件是main.py,所以path的设定及FLASK_APP等环境变量这些个问题我有点凌乱,比如总是无法设置成flask run直接执行程序,只能靠pytharm的run命令。囧。
自己不懂就问度娘吧,在网上找到两篇靠谱的文章:
https://www.cnblogs.com/dreamyu/p/7889959.html
https://blog.youkuaiyun.com/jianglianye21/article/details/78086768

问题和我一样,是cmd/shell直接运行.py文件时系统环境变量path中没有当前.py文件的目录,导致无法import所需要的模块,我们要做的就是在path环境变量中追加入文件所在的目录:

# -*- coding:utf-8 -*-
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)

那么这段代码什么意思呢?如果熟悉os.path和sys.path的人一看就知道,不熟悉的还要普及下,比如我,orz…

os.path.abspath(path)

返回path规范化的绝对路径。

>>> os.path.abspath('test.csv') 
'C:\\Python25\\test.csv' 
os.path.dirname(path)

返回path的目录。其实就是os.path.split(path)的第一个元素。

>>> os.path.dirname('c:\\csv\test.csv') 
'c:\\csv' 
os.path.split(path)

将path分割成目录和文件名二元组返回。

>>> os.path.split('c:\\csv\\test.csv') 
('c:\\csv', 'test.csv')
sys.path.append(path)

将path加入系统环境变量path
sys.path是python的搜索模块的路径集,是一个list

['', 'C:\\WINDOWS\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26\ \lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python26 ', 'C:\\Python26\\lib\\site-packages', 'C:\\Python26\\lib\\site-packages\\win32' , 'C:\\Python26\\lib\\site-packages\\win32\\lib', 'C:\\Python26\\lib\\site-packa ges\\Pythonwin']

append(path)其实就是相当于set path=%path%;path

所以以上代码其实就是将manage.py文件的目录添加到环境变量path里去,之前在IDE里面能跑是因为IDE设置了path,我们已经在默认的项目路径中,所以直接执行是没有问题的。但在cmd中执行程序,所在路径是python的搜索路径,如果涉及到import引用就会报类似ImportError: No module named xxx这样的错误,所以我们就需要手动添加当前目录到环境变量

对了,这段代码要放在import之前,所以最好直接放在manage.py文件开始。

欧了,走过的弯路+1

gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker-compose up -d --build superset [+] Building 43.8s (8/8) FINISHED => [internal] load local bake definitions 0.0s => => reading from stdin 534B 0.0s => [internal] load build definition from Dockerfile.superset 0.0s => => transferring dockerfile: 187B 0.0s => [internal] load metadata for docker.io/apache/superset:latest 0.2s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => CACHED [1/2] FROM docker.io/apache/superset:latest@sha256:09735adaae3945c5a8fabbeca31a7954c8c74de195702ba61622aee8604d5c55 0.0s => => resolve docker.io/apache/superset:latest@sha256:09735adaae3945c5a8fabbeca31a7954c8c74de195702ba61622aee8604d5c55 0.0s => [2/2] RUN pip install gevent psutil pymysql flask-appbuilder 38.3s => exporting to image 4.9s => => exporting layers 3.7s => => exporting manifest sha256:82d33bb9c53a4c0ac4cb0c9a6708c1caa47afb290994e09e2a08de777c16d6f4 0.0s => => exporting config sha256:d1345dac6a9738536a67df5f151e9d78ab5943550af677f25913cc8999eccad3 0.0s => => exporting attestation manifest sha256:1a0ad0b44f2bf0483ec8220fe8beb21a77f515bb8ee62877a04dadedec21225a 0.0s => => exporting manifest list sha256:f278d4489ade0269979766275aca8e4fef7e84799e9d5c00b24d65698c5c58ad 0.0s => => naming to docker.io/library/superset-with-gevent:latest 0.0s => => unpacking to docker.io/library/superset-with-gevent:latest 1.0s => resolving provenance for metadata file 0.0s [+] Running 4/4 ✔ superset-with-gevent Built 0.0s ✔ Network superset-prod_superset-net Created 0.0s ✔ Container redis Started 0.6s ✔ Container superset_app Started 0.6s gapinyc@DESKTOP-9QS7RL5:~/superset-prod$ docker-compose run --rm superset-init [+] Creating 1/1 ✔ Container redis Running 0.0s [+] Running 1/1 ✔ Container superset_app Started 0.2s Waiting for Superset DB to be ready... Loaded your LOCAL configuration at [/etc/superset/superset_config.py] 2025-10-21 08:48:59,951:ERROR:superset.app:Failed to create app Traceback (most recent call last): File "/app/.venv/lib/python3.10/site-packages/superset/app.py", line 40, in create_app app_initializer.init_app() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 466, in init_app self.setup_db() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 662, in setup_db pessimistic_connection_handling(db.engine) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 998, in engine return self.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1017, in get_engine return connector.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 594, in get_engine self._engine = rv = self._sa.create_engine(sa_url, options) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1027, in create_engine return sqlalchemy.create_engine(sa_url, **engine_opts) File "<string>", line 2, in create_engine File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 375, in warned return fn(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 544, in create_engine dbapi = dialect_cls.dbapi(**dbapi_args) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/pymysql.py", line 80, in dbapi return __import__("pymysql") ModuleNotFoundError: No module named 'pymysql' Traceback (most recent call last): File "/app/.venv/bin/superset", line 10, in <module> sys.exit(superset()) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1157, in __call__ return self.main(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1078, in main rv = self.invoke(ctx) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1685, in invoke super().invoke(ctx) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1434, in invoke return ctx.invoke(self.callback, **ctx.params) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 783, in invoke return __callback(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/click/decorators.py", line 33, in new_func return f(get_current_context(), *args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 355, in decorator app = __ctx.ensure_object(ScriptInfo).load_app() File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 309, in load_app app = locate_app(import_name, name) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 238, in locate_app return find_app_by_string(module, app_name) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 166, in find_app_by_string app = attr(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/superset/app.py", line 40, in create_app app_initializer.init_app() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 466, in init_app self.setup_db() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 662, in setup_db pessimistic_connection_handling(db.engine) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 998, in engine return self.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1017, in get_engine return connector.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 594, in get_engine self._engine = rv = self._sa.create_engine(sa_url, options) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1027, in create_engine return sqlalchemy.create_engine(sa_url, **engine_opts) File "<string>", line 2, in create_engine File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 375, in warned return fn(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 544, in create_engine dbapi = dialect_cls.dbapi(**dbapi_args) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/pymysql.py", line 80, in dbapi return __import__("pymysql") ModuleNotFoundError: No module named 'pymysql' Loaded your LOCAL configuration at [/etc/superset/superset_config.py] 2025-10-21 08:49:03,271:ERROR:superset.app:Failed to create app Traceback (most recent call last): File "/app/.venv/lib/python3.10/site-packages/superset/app.py", line 40, in create_app app_initializer.init_app() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 466, in init_app self.setup_db() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 662, in setup_db pessimistic_connection_handling(db.engine) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 998, in engine return self.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1017, in get_engine return connector.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 594, in get_engine self._engine = rv = self._sa.create_engine(sa_url, options) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1027, in create_engine return sqlalchemy.create_engine(sa_url, **engine_opts) File "<string>", line 2, in create_engine File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 375, in warned return fn(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 544, in create_engine dbapi = dialect_cls.dbapi(**dbapi_args) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/pymysql.py", line 80, in dbapi return __import__("pymysql") ModuleNotFoundError: No module named 'pymysql' Traceback (most recent call last): File "/app/.venv/bin/superset", line 10, in <module> sys.exit(superset()) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1157, in __call__ return self.main(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1078, in main rv = self.invoke(ctx) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1685, in invoke super().invoke(ctx) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1434, in invoke return ctx.invoke(self.callback, **ctx.params) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 783, in invoke return __callback(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/click/decorators.py", line 33, in new_func return f(get_current_context(), *args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 355, in decorator app = __ctx.ensure_object(ScriptInfo).load_app() File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 309, in load_app app = locate_app(import_name, name) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 238, in locate_app return find_app_by_string(module, app_name) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 166, in find_app_by_string app = attr(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/superset/app.py", line 40, in create_app app_initializer.init_app() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 466, in init_app self.setup_db() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 662, in setup_db pessimistic_connection_handling(db.engine) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 998, in engine return self.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1017, in get_engine return connector.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 594, in get_engine self._engine = rv = self._sa.create_engine(sa_url, options) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1027, in create_engine return sqlalchemy.create_engine(sa_url, **engine_opts) File "<string>", line 2, in create_engine File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 375, in warned return fn(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 544, in create_engine dbapi = dialect_cls.dbapi(**dbapi_args) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/pymysql.py", line 80, in dbapi return __import__("pymysql") ModuleNotFoundError: No module named 'pymysql' Loaded your LOCAL configuration at [/etc/superset/superset_config.py] 2025-10-21 08:49:06,380:ERROR:superset.app:Failed to create app Traceback (most recent call last): File "/app/.venv/lib/python3.10/site-packages/superset/app.py", line 40, in create_app app_initializer.init_app() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 466, in init_app self.setup_db() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 662, in setup_db pessimistic_connection_handling(db.engine) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 998, in engine return self.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1017, in get_engine return connector.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 594, in get_engine self._engine = rv = self._sa.create_engine(sa_url, options) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1027, in create_engine return sqlalchemy.create_engine(sa_url, **engine_opts) File "<string>", line 2, in create_engine File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 375, in warned return fn(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 544, in create_engine dbapi = dialect_cls.dbapi(**dbapi_args) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/pymysql.py", line 80, in dbapi return __import__("pymysql") ModuleNotFoundError: No module named 'pymysql' Traceback (most recent call last): File "/app/.venv/bin/superset", line 10, in <module> sys.exit(superset()) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1157, in __call__ return self.main(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1078, in main rv = self.invoke(ctx) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1685, in invoke super().invoke(ctx) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 1434, in invoke return ctx.invoke(self.callback, **ctx.params) File "/app/.venv/lib/python3.10/site-packages/click/core.py", line 783, in invoke return __callback(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/click/decorators.py", line 33, in new_func return f(get_current_context(), *args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 355, in decorator app = __ctx.ensure_object(ScriptInfo).load_app() File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 309, in load_app app = locate_app(import_name, name) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 238, in locate_app return find_app_by_string(module, app_name) File "/app/.venv/lib/python3.10/site-packages/flask/cli.py", line 166, in find_app_by_string app = attr(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/superset/app.py", line 40, in create_app app_initializer.init_app() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 466, in init_app self.setup_db() File "/app/.venv/lib/python3.10/site-packages/superset/initialization/__init__.py", line 662, in setup_db pessimistic_connection_handling(db.engine) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 998, in engine return self.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1017, in get_engine return connector.get_engine() File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 594, in get_engine self._engine = rv = self._sa.create_engine(sa_url, options) File "/app/.venv/lib/python3.10/site-packages/flask_sqlalchemy/__init__.py", line 1027, in create_engine return sqlalchemy.create_engine(sa_url, **engine_opts) File "<string>", line 2, in create_engine File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 375, in warned return fn(*args, **kwargs) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/engine/create.py", line 544, in create_engine dbapi = dialect_cls.dbapi(**dbapi_args) File "/app/.venv/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/pymysql.py", line 80, in dbapi return __import__("pymysql") ModuleNotFoundError: No module named 'pymysql' ✅ Superset 初始化完成! gapinyc@DESKTOP-9QS7RL5:~/superset-prod$
10-22
from flask import Flask, abort, render_template import os from flask_sqlalchemy import SQLAlchemy import pymysql from common.extensions import db pymysql.install_as_MySQLdb() # ModuleNotFoundError: No module named 'MySQLdb' app = Flask(__name__, template_folder='template', static_url_path='/', static_folder='resource') app.config['SECRET_KEY'] = os.urandom(24) # 使用集成方式处理SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@localhost:3306/woniunote?charset=utf8' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # True: 跟踪数据库的修改,及时发送信号 app.config['SQLALCHEMY_POOL_SIZE'] = 100 # 数据库连接池的大小。默认是数据库引擎的默认值(通常是 5) ctx = app.app_context() ctx.push() # 实例化db对象 # db = SQLAlchemy()#(app) db.init_app(app) # 定义404错误页面 @app.errorhandler(404) def page_not_found(e): return render_template('error-404.html') # 定义500错误页面 @app.errorhandler(500) def server_error(e): return render_template('error-500.html') # 定义全局拦截器,实现自动登录 @app.before_request def before(): url = request.path pass_list = ['/user', '/login', '/logout'] if url in pass_list or url.endswith('.js') or url.endswith('.jpg'): pass elif session.get('islogin') is None: username = request.cookies.get('username') password = request.cookies.get('password') if username != None and password != None: user = Users() result = user.find_by_username(username) if len(result) == 1 and result[0].password == password: session['islogin'] = 'true' session['userid'] = result[0].userid session['username'] = username session['nickname'] = result[0].nickname session['role'] = result[0].role # 通过自定义过滤器来重构truncate原生过滤器 def mytruncate(s, length, end='...'): count = 0 new = '' for c in s: new += c # 每循环一次,将一个字符添加到new字符串后面 if ord(c) <= 128: count += 0.5 else: count += 1 if count > length: break return new + end # 注册mytruncate过滤器 app.jinja_env.filters.update(truncate=mytruncate) # 定义文章类型函数,供模板页面直接调用 @app.context_processor def gettype(): type = { '1': 'PHP开发', '2': 'Java开发', '3': 'Python开发', '4': 'Web前端', '5': '测试开发', '6': '数据科学', '7': '网络安全', '8': '蜗牛杂谈' } return dict(article_type=type) @app.route('/preupload') def pre_upload(): return render_template('file-upload.html') @app.route('/upload', methods=['POST']) def do_upload(): headline = request.form.get('headline') content = request.form.get('content') file = request.files.get('upfile') print(headline, content) # 可以正常获取表单元素的值 suffix = file.filename.split('.')[-1] # 取得文件的后缀名 # 也可以根据文件的后缀名对文件类型进行过滤,如: if suffix.lower() not in ['jpg', 'jpeg', 'png', 'rar', 'zip', 'doc', 'docx']: return 'Invalid' # 将文件保存到某个目录中 file.save('D:/test001.' + suffix) return 'Done' if __name__ == '__main__': from controller.index import * app.register_blueprint(index) from controller.user import * app.register_blueprint(user) from controller.article import * app.register_blueprint(article) from controller.favorite import * app.register_blueprint(favorite) from controller.comment import * app.register_blueprint(comment) from controller.ueditor import * app.register_blueprint(ueditor) from controller.admin import * app.register_blueprint(admin) from controller.ucenter import * app.register_blueprint(ucenter) app.run(debug=True)这是我的主应用文件
最新发布
12-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值