Flask-Script: "ModuleNotFoundError: 找不到模块名为 'flask._compat'"

16
当使用Flask-Script时,我在导入Manager时遇到了一个错误。
我已经安装了Flask和Flask-Script。我该如何解决这个问题?

manage.py

from flask_script import Manager

from main import app

manager = Manager(app)

@manager.command
def hello():

    print ("hello")

if __name__ == "__main__":
    manager.run()

main.py

from flask import Flask

app = Flask(__name__)

Error

(venv) raul@raul-PC:~/Proyectos Python/flask_script$ python3 manage.py hello
Traceback (most recent call last):
  File "manage.py", line 1, in <module>
    from flask_script import Manager
  File "/home/raul/Proyectos Python/flask_script/venv/lib/python3.8/site-packages/flask_script/__init__.py", line 15, in <module>
    from flask._compat import text_type
ModuleNotFoundError: No module named 'flask._compat'
11个回答

21
你更新了Flask到2.0.0及以上的版本吗? 将Flask降级到1.1.2版本,它就能正常工作了。
不需要使用Flask-Script,你可以直接使用以下命令:
  • flask db init 初始化数据库
  • flask db migrate 迁移新的更改
  • flask db upgrade 升级等等

我刚刚按照建议重新安装了Flask 2.0,但仍然遇到了相同的错误。你最初提出使用1.1.2似乎是唯一的解决方案。 - Andrew Spear
对于那些刚接触 Flask 和一些数据库操作的人来说,为了使用 flask db... 命令,你需要在你的主 Flask 应用文件(即 app.py)中添加并初始化 Migrate 对象:from flask_migrate import Migrate ... migrate = Migrate(app, db)这样就可以使用 Flask 2.0(其中有一些很酷的新功能)而不需要降级。 - autry.richard
这是否意味着我们不能在 Flask v2+ 上使用 Flask-Migrate? - Ryan Aquino
2
@RyanAquino 不,Flask-Migrate 可用且运行良好!只是 Flask-Script 已不再使用,被更好的 Flask CLI 替代。 其他人可以查看下面的答案:https://dev59.com/QFEG5IYBdhLWcg3wWa9H#69593538 和 将 Migrate Flask-Script 迁移到 Flask 2.0 CLI 文章。 - cristian
这是我的Python项目的环境信息。 Python 3.10.8 Flask 3.0.0 Werkzeug 3.0.1这是整个代码库。 https://github.com/SWS-5007/TellMeWhenToGo_Python这是我的错误信息。 File "C:\Users\HOME\AppData\Local\Programs\Python\Python310\lib\site-packages\flask_script\__init__.py", line 15, in <module> from flask._compat import text_type ModuleNotFoundError: No module named 'flask._compat'我的manage.py文件的代码有什么问题? 如何修复这个错误? - undefined

19
首先,我在PyCharm\settings\projet: myapp\python interpreter上手动安装了模块,通过选择我的解释器并安装缺失的库,如Flask本身,flask-migrateflask-script
对于这个特定的错误:
    from flask._compat import text_type
ModuleNotFoundError: No module named 'flask._compat'

这是因为Python在寻找一个名为Flask._compat的目录时发现它不存在,所以我更新了flask_script/__init__.py文件并修改了代码:
在原始的flask-script文件中:
from ._compat import text_type` 

To:

from flask_script._compat import text_type

然后它就可以工作了!

这应该是被接受的答案,它解决了问题,有人应该联系flask_script开发者来修复这个问题,因为错误仍然存在于最新的Flask-Script==2.0.6Flask==2.0.1中。 - Abc Xyz
2
Flask-Script目前与Flask 2.0.1不兼容。我已经编辑了我的答案。 - Ashutosh Krishna
嗯,我没有检查兼容性问题,但是 from flask_script._compat import text_type 可以解决这个错误 ModuleNotFoundError: No module named 'flask._compat' - Abc Xyz
1
这是一个hack解决方案。flask-script与最新的Python生态系统开箱即用的正确解决方案是什么? - Kok How Teh
@KokHowTeh 通过完全不使用它,并转而使用更新的Flask工具和其他包来实现。Flask-Script已经过时了。 - undefined

10

我降级到flask-script==2.0.5,即使使用Flask==2.0.2,也能成功解决问题。


6

我从我的主应用程序中删除了"from flask_script import Manager",也删除了"manager = Manager(app)"。

还从 requirements.txt 文件中删除了该行。

在GitHub上发现:flask_script 不是 Flask 本身,而是由其他人编写的(已死-存档)Flask扩展。

现在我的程序可以运行在 Flask 2.0.1 上。


4
根据Flask-Script的发布历史和最后一个版本,Flask-Script不太可能为Flask 2.x或任何其他版本创建兼容版本。Miguel Grinberg在他的文章中解释了这一点,并且Flask 0.11引入Flask CLI可能导致了Flask-Script的消亡(他没有错,日期是相符的)。
而且,您不需要降级到使用任何技术的最新版本来构建应用程序。为什么要这样做呢?新版本带有新功能、更好的安全性、提高效率等等。为什么要坚持使用四年前就已经停止更新的库呢?
您应该做的是采用 Flask CLI,并使用我上面链接的 Miguel Grinberg 的文章,继续享受 Flask 2.0.x 的新功能。George Studenko Medium 文章 可能对您也有所帮助。这是一种更长、更棘手的解决方案,但最终更有回报。祝你好运。

3

我安装了 Flask 1.1.4。

pip install "Flask==1.1.4"

还有werkzeug

pip install "werkzeug==1.0.1"

1
作为 Flask 或 Flask-Script 降级的替代方案,我使用了:
from flask_login._compat import text_type

我在项目依赖项中已经安装了flask_login包。


-1

我尝试使用Flask-Script-

  1. 我的 requirement.txt 文件内容如下:

     click==7.1.2
     colorama==0.4.4
     Flask==1.1.4
     Flask-Script==2.0.6
     itsdangerous==1.1.0
     Jinja2==2.11.3
     MarkupSafe==2.0.1
     Werkzeug==1.0.1
    
  2. app.py 文件内容如下:

     from flask import Flask
     app = Flask(__name__)
    
     if __name__ == "__main__":
         app.run(debug=True)
    
  3. manage.py 文件内容如下:

     from flask_script import Manager
     from app import app
    
     manager = Manager(app)
    
     @manager.command
     def hello():
         print('test')
    
     if __name__ == "__main__":
         manager.run()
    
  4. 运行命令 - python manage.py hello

  5. 我的输出结果为 "test"


对于阅读这个答案的读者来说,这个答案的主要观点是使用Flask==1.1.4Flask-Script==2.0.6,这已经在其他答案中提到过了。 - undefined

-1

快速且永久性的解决方案:

由于该错误导致Virtual/libs/Flask_Script/init.py文件的第15行出现问题。

请按照以下步骤操作:

  1. 替换第15行

    from ._compat import text_type on original flask-script file

使用以下代码进行替换: from flask_script._compat import text_type

然后,

  1. 降级flask: pip install flask==1.1.4
  2. 安装兼容的Markupsafe: pip install markupsafe==2.1.0

还要确保已安装这些依赖项:

    pip install flask_script
    pip install flask_bootstrap

从这个点开始,您的项目应该可以完美地运行。


这远非“永久”的解决方案,因为它需要修改Python包文件(在其他环境部署/运行应用程序时不具备可移植性),而且在Flask <= 1.x版本上会遇到困难。 - undefined

-1

你可以尝试降低 Flask 版本。

如果你使用 pip,那么应该执行以下步骤:

  1. python3 -m pip uninstall flask
  2. python3 -m pip install flask==1.1.4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接