当我在flask的create_app方法里import同一个模块的两个文件时出现不同的情况。

def create_app(config_name=None):...with app.app_context():if is_debug_mode() and not is_werkzeug_reloader_process():passelse:from app.sched import etl # 或tasksscheduler.start()from app.sched import scheduler_configinit_jobs()return app

etl和tasks里面都有:

from app import scheduler

但是,如果是import tasks不会报错,import etl会报如下错误:

ImportError: cannot import name 'scheduler' from 'app'

那么,etl和tasks到底有啥区别:

task.py模块

from flask import current_appfrom app import scheduler
from app.sched.etl import etl_resource_data
from app.sched.scheduler_config import ETL_JOB_PARAMS@scheduler.task(id="etl_daily_tyedu_st_resource_data", **ETL_JOB_PARAMS,args=[{"src": current_app.config.get("SQLALCHEMY_DATABASE_URI"),"dest": current_app.config.get("CH_DATABASE_URI")}])
def etl_resource_data_daily(args):etl_resource_data(args['src'], args['dest'])

tasks直接是一个装饰器的task

etl.py模块:代码有点多,省略一下:

import petl as etlfrom flask import current_appfrom app import scheduler
from app.sched.scheduler_config import ETL_JOB_PARAMSfrom sqlalchemy import create_engine, desc
from clickhouse_driver import connect
from sqlalchemy.orm import sessionmakerfrom config import EngineConfig
from agents.models import ResourceDatachdb_http = sessionmaker(bind=create_engine(EngineConfig.CH_HTTP_URI))()def fill_resdata_from_recalldata(datas):...@scheduler.task(id="etl_daily_tyedu_st_resource_data", **ETL_JOB_PARAMS,args=[{"src": current_app.config.get("SQLALCHEMY_DATABASE_URI"),"dest": current_app.config.get("CH_DATABASE_URI")}])
def etl_resource_data_daily(args):etl_resource_data(args['src'], args['dest'])

我判断

import tasks的时候,是把@scheduler.task这段代码拿过去了

import etl的时候,

  File "C:\Users\15871\Projects\python\rms\app\__init__.py", line 18, in <module>from app.blueprints.jobs import jobs_bpFile "C:\Users\15871\Projects\python\rms\app\blueprints\jobs.py", line 11, in <module>from app.sched.job_controller import start_jobFile "C:\Users\15871\Projects\python\rms\app\sched\job_controller.py", line 11, in <module>from app.sched.etl import etl_recall_dataFile "C:\Users\15871\Projects\python\rms\app\sched\etl.py", line 13, in <module>from app import scheduler
ImportError: cannot import name 'scheduler' from 'app'

实际上是在前面,注册blueprint时候就报错。

局部import为什么不报错?因为局部import的是其父级模块(import它的模块)里面import了scheduler对象。

说明局部import代码可以利用父级模块的import对象,因为局部import是父级模块完成了它的import才发生。而全局import是不能这样的,全局import整个import是一块,没有先后。

这是这个问题的原因,理解了吗?

所以,复杂项目的import很复杂,一定要小心。

python3 import的一个细节相关推荐

  1. python2 python3 import,从python2到python3的导入处理/模块的更改?

    我试图遵循与SQLAlchemy相关的this previous question中显示的设计模式,并打算在多个文件中共享一个公共的基本实例.代码完全可以在python2和python3上运行.在 但 ...

  2. 面试了一个32岁的程序员,一个细节就看出来是培训班的····

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  3. python搞笑语句_云计算开发学习笔记:Python3 import语句

    原标题:云计算开发学习笔记:Python3 import语句 想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下: 当解释器遇到 import 语句,如果模块在当前的 ...

  4. 面试了一个程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  5. 面试了一个34岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  6. 面试了一个32岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验....

    首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情. 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的轰动. &qu ...

  7. delphi dbgrideh 遍历每一个单元格_利用财务函数制作贷款计算器,让你了解还款的每一个细节...

    大家好我是践行计算机教育刘老师,今天跟大家分享利用财务函数可以制作贷款计算机,以方便了解还款过程中的每一个细节. 贷款示例效果图 制作贷款计算器 制作贷款计算器-计算每月还款额 在C6单元格中输入公式 ...

  8. Protoc Buffer 优化传输大小的一个细节

    Protoc Buffer 是我们比较常用的序列化框架,Protocol Buffer 序列化后的占空间小,传输高效,可以在不同编程语言以及平台之间传输.今天这篇文章主要介绍 Protocol Buf ...

  9. Windows anaconda python3 import ssl报错的解决方案

    Windows anaconda python3 import ssl报错的解决方案_dailinqing1984的博客-CSDN博客

  10. Python3求最后一个单词长度

    Python3求最后一个单词长度 原题:https://leetcode-cn.com/problems/length-of-last-word/ 给定一个仅包含大小写字母和空格 ' ' 的字符串 s ...

最新文章

  1. 黑客是如何绕过WAF的
  2. PEAR安装、管理及使用
  3. 【哈佛商学院和斯坦福要求学生必看的20部电影】中/英字幕
  4. Lombok 安装、入门 - 消除冗长的 java 代码
  5. JS解析XML文件和XML字符串
  6. 互联网协议入门(二)
  7. 调取方法_转需!不去阿里巴巴调取支付宝交易证据方法
  8. php中文截取无乱码,PHP截取中文无乱码_PHP教程
  9. VTK初始化New返回Null问题
  10. java 持续交付_【Java架构:持续交付】一篇文章搞掂:Jenkins
  11. Low Power概念介绍<Level Shifter>
  12. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
  13. Servlet文件下载
  14. 程序、代码、硬件常见的英文缩写
  15. 不会画关系图?5 类图形为你展示—变量间相互关系—提供示例与完整代码-ggplot2-geom_point-ComplexHeatmap-pheatmap-ggpairs
  16. [CF505E]Mr. Kitayuta vs. Bamboos/[海军国际项目办公室]迷途竹林
  17. 计算机主机箱进行总结,工业级主机用机箱分类总结
  18. 通过安卓模拟器使直播软件obs的0粉丝用户开播
  19. 模拟GRE隧道建立过程
  20. 闭锁java_Java 闭锁实例

热门文章

  1. 使用腾讯云轻量应用服务器搭建网站教程(也太简单了)
  2. python拆分参数列表_Python序列拆分操作符与映射拆分操作符实例
  3. 模拟信号数字化传输系统的设计与仿真分析说明书
  4. 视频教程-Go快速入门强化-Go语言
  5. 数据分析步骤(思维导图)
  6. vlc搭建流媒体转发服务器
  7. 算法设计与分析课设-探寻宝藏-双线程DP问题-C语言
  8. 局域网故障诊断袖珍手册
  9. JS中var、let以及const关键字到底怎么用?
  10. Unity美术场景制作基础流程和注意事项梳理