python命令行下导入包没有调用__init__.py的坑

出现问题的地方

  用flask写后台程序的时候,用了蓝图:

python命令行下导入包没有调用__init__.py的坑_第1张图片
  正常用pycharm的运行没有问题,此时正好要用sqlalchemy创建数据库了,我进入Pycharm的命令行模式,输入: from Ordering import *,希望用 db.create_all()一键创立数据库,但test没有定义。
  test/__init__.py下,只有一句: from test.test import *,而test/test.py 下,定义了名为test的蓝图,正常用pycharm运行都能找到,但命令行却提示找不到。

调试及发现问题原因

  首先打开以前的项目,对比项目结构,没发现什么不同,之前的项目都能正常用命令行导入。
  __init__.py中,应该将test.py中的test蓝图变量导入了,当import test时,test.test就应该能找到蓝图变量。
  此时我输入import test,没有问题,打印test,结果是__init__.py的路径,输入test.test时,告诉我未定义test变量。
  于是在__init__.py中,定义了变量a=100,同样test.a找不到变量,又加了一条语句:print('init test'),在Pycharm运行时正常导入输出,在命令行一样看不到输出。
  结果明朗了,__init__.py未被正常调用。
  国内百度,差不多都是说路径没有正常添加,但是我在命令行下sys.path的个数比pycharm的sys.path都要多两个,主要的路径也都有,因此几乎可以排除是这方面问题。
  google查到stackoverflow:网址,情况类似,那个人是code.py的包无法被正常调用,下面有回答说,是因为包名起的特殊,code和python内置的描述符冲突了。
  确实存在这个可能,我记得方法的描述符中,就存在__code__,test作为常用名称,也存在冲突的可能,因此我将模块名及相关变量名改了,果然能正常导入了。
  或许pycharm已经为我们做了避开歧义的功能,但基础的命令行没有这么智能。

解决方法

  更改模块名称,避开python的描述符,例如code、doc、dict、main等等。

你可能感兴趣的:(python命令行下导入包没有调用__init__.py的坑)