ModuleNotFoundError: No module named 'apscheduler.schedulers'; 'apscheduler' is not a package

这个坑真是个巨坑,掉入了传说中的python陷阱中

先说下背景
第一次用Flask-APScheduler定时器功能,不太了解,我的框架结构如下:
项目结构
我把相关的两个文件黄色标亮了
老司机们可能从这个图就能发现问题了,但是对于flasher来说不知道此处已经有坑。
我们继续说:

先说main.py

from flask_apscheduler import APScheduler
...

class APSchedulerJobConfig(object):
    JOBS = [
        {
            'id': 'autosubimit',
            'func': 'flaskdemo.apschedulertask:auto_submit_planlist',
            'args': None,
            'trigger': {
                'type': 'cron',
                'hour': '23',
                'minute': '50'
            }
        }
    ]
    SCHEDULER_API_ENABLED = True
    SQLALCHEMY_ECHO = True

app.config.from_object(APSchedulerJobConfig)

if __name__ == "__main__":
	...
    # Init scheduler
    scheduler = APScheduler()
    scheduler.init_app(app)
    scheduler.start()
	...

似乎都按照DEMO来的,没啥问题对吧,其实问题和上图一样隐藏在这里
至于apscheduler.py,里面就我的后端异步处理函数,这里就不贴了。

好,Run,Bang!出问题了:

C:\Users\lanjian\.virtualenvs\change-report-teamA-1zY4WLjB\Scripts\python.exe D:/DEV/change-report-teamA/flaskdemo/main.py
Traceback (most recent call last):
  File "D:/DEV/change-report-teamA/flaskdemo/main.py", line 5, in <module>
    from flask_apscheduler import APScheduler
  File "C:\Users\lanjian\.virtualenvs\change-report-teamA-1zY4WLjB\lib\site-packages\flask_apscheduler\__init__.py", line 17, in <module>
    from apscheduler.schedulers.base import STATE_PAUSED, STATE_RUNNING, STATE_STOPPED
ModuleNotFoundError: No module named 'apscheduler.schedulers'; 'apscheduler' is not a package

Process finished with exit code 1

导入库都出错,我可是啥都还没干呀!
然后就本能怀疑库,pip uninstall及pip install之间重复捣腾,无果
然后在别的项目中试着import这个库也没问题,就是在这里出问题了!
刷了N多网页中终于在stackoverflow中找到了一个“盟友”,遇到了和我一样的问题!
传送门:https://stackoverflow.com/questions/46491967/the-error-no-module-named-apscheduler-schedulers
大神1答复:You seem to be victim of a common Python pitfall. Just rename your file to something not used by a library, and you will be fine.
大神2答复:I notice that the python file you use is also called apscheduler.py.
Possibly the importer is getting confused and uses apscheduler.py as startpoint for importing ‘apscheduler.schedulers’. Rename your python script and try again (make sure there is no apscheduler.py file anymore).

大神就是厉害,仅凭网友贴出的debug错误信息就找到了问题所示(一般人都只盯着代码看,而忽略了错误信息里面的文件名)

没错,就是说我和这位“盟友”错误的用了被库里已经用了的文件名:apscheduler.py,导致编译器困惑了,报错。PYTHON因为开源库很多,导入时常常会遇到取了和库中用到的文件名一样的文件名(或者函数名、对象名),就容易出错,这叫做python陷阱,要避开。

解决方案

就是将apscheduler.py改名,随便改一个别的即可,比如apschedulertask.py

PS:这里我得说下为啥我会神乎其神的取这个名,因为当时看别人的代码,他取的名是apschedule.py,我没看到他末尾少了个’r’,我就习惯性的取名apscheduler.py了,真是一个大坑哈~

走过的弯路+1,谨记

发布了25 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/arnolan/article/details/85059048
今日推荐