db2.py 里
a=10
db1.py 里
from .db2 import a
b = a
print(b)
运行db1.py 会报错:
Traceback (most recent call last):
File "C:/Users/hp/PycharmProjects/mY/y_pro/daobao/db1.py", line 1, in <module>
from .db2 import a
SystemError: Parent module '' not loaded, cannot perform relative import
总结问题:
-
pycharm对 from .db2 import a 认为正确,但是db1.py运行起来会错误,运行p1.py 就成功并打印 2 个10.
-
pycharm对 from db2 import a 认为错误,但是在db1.py运行起来会正确, p1.py则运行错误。
原因是 :from .db2 import a 的.db2会让 pycharm 知道要从要从运行的模块db1.py的 路径找同级的文件,这里当然找到了,所以就不报错。但是from .db2 import a 会让python解释器在所在运行的db1.py模块中无法识别,(from db2 import a才正确),认为这是错误的语法(不是找不到,是纯粹不允许)。但是只要不在db1.py模块运行,python解释器一旦导入db1.py就要求db1.py导入其它同级模块时要from .db2 import a。**
pycharm 默认项目(y_pro)路径为导包路径(这个还没验证过, 可以先这样理解),所以from db2 import a 会让pycharm 在项目y_pro路径下找db2,然而在y_pro下一级是没有db2的。所以会报红。但是python3 解释器要 from db2 import a,才会从正运行的db1.py的同级目录下找db2**,所以能运行正确。
可以将当前路径(daobao)设置为根路径, 右键对应的包名(例如:daobao)-》Mark Directory as -》Sources Root,这样 from db2 import a,无论是pycharm还是python解释器都能运行正确,不报红。
规律总结:在运行的模块db1上,要让模块db1导入同级的模块db2,pycharm要from .db2 import a。python解释器要from db2 import a。
不在模块db1上运行但要引入模块db2的内容,(为了间接引出模块B的内容),pycharm始终要from .db2 import a,而python解释器则也要from .db2 import a 才能运行正确。
若要pycharm和python解释器完全保持一致,则把db1.py的父级(daobao)设置为根路径,db1.py 只需要from db2 import a 就好了。
这个解释看起来虽然是很绕,不过你只要仔细地看,甚至画图就明白关系了,无非就是pycharm和python解释器对于在所在模块运行和不在所在模块运行的4种情况,在我看来这是设计者没配合好的一个表现,太复杂了,本应该统一的。
研究这个看似简单的导报路径竟然耗费了我巨大的时间(7小时左右)真是让我很吃惊和无奈,我想我要好好考虑面对这类问题怎样才能以很简单的方式和高效率的速度来总结和应用。把事情简单化。