python 同级目录包导入问题,使用"."错误

Pyhton3.6, 使用的是Pycharm

 1、

同级目录导入包可使用方式如下;(直接运行.py文件时

from test_import2 import Css2
import test_import2                            (直接使用import)
from testwork.test_import2 import Css2         (这种testwork下需要有__init__.py文件,才会把testwork作为一个python的包应用,文件可以是空的,)

包结构如图

代码文件

test_import2

class Css2():
    def __init__(self):
        pass

    def fun2(self):
        print('t2')


test_import1

import sys
from .test_import2 import Css2


def aa():
    print(sys.path)
    Css2().fun2()

if __name__ == '__main__':
    print(sys.path)
    Css2().fun2()


test_import3

from testwork import test_import1

test_import1.aa()

在test_import1使用from .test_import2 import Css2 时提示报错

Traceback (most recent call last):
File "E:/pycharm/testwork/test_import1.py", line 3, in <module>
from .test_import2 import Css2
ModuleNotFoundError: No module named '__main__.test_import2'; '__main__' is not a package

__main__表示程序入口,这里也就是文件本身,意思是文件不是一个Python的包

加"."后就报这个错误

但网上看到其他的资料,和lib/site-pakages中在引用同级文件时也大量采用了 from .models import xx类似的形式;

一番折腾下,特别是在site-pakages的requests库下添加测试文件,在使用类似requests的引用,发现也可以使用from .models import xx形式的;

最后就像上面建了test_import3,调用test_import1,而test_import1使用from .models import xx形式调用test_import2

发现test_import3可以正常使用;

最后得出结论加"."的间接引用方式不能直接运行,但其它模块可用通过调用他来使用;

 

2、

像图片上这种,大量采用了--from pakages.models import xx 的引用同级目录文件方式;

会出现报错,1、可能是包缺少__init__.py文件,不认可你的文件夹名是一个包

2、可能是应为没有搜索路径不对

使用 import sys  sys.path  查看系统搜索路径

要有一个路径是包所在的父目录下,也就是图中“”“ethereum”这个目录的上一级目录;

解决方法是配置搜索路径;(也可以直接把包扔到搜索路径下)

简单的方法在sys.path展示的路径下(最好是选择一个类似这个C:\Python36\Lib\site-packages的路径,它第三方库管理存储的地方)添加xxx.pth文件(内容为你想要加载的包父目录)

如图我的ethereum文件夹就在E:\go\wen这个路径下。

 

以上都是个人实践总结,如有错误,欢迎大家指出

 

posted @ 2018-01-25 16:41  曙暮之光  阅读(14121)  评论(2编辑  收藏  举报