出现问题的地方
用flask写后台程序的时候,用了蓝图:
正常用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等等。
网友评论