Python import同级modul

发布时间:2019-09-15 09:57:05编辑:auto阅读(1670)

        看了一段Python的基础视频,正好赶上单位需要做个小工具。索性拿它练练手,刚刚开动就遇到一个新的问题:目录引用。简单的说,就是将不同的功能代码,分到不同的目录文件中,代码中涉及到同级目录调用,问题就出来了“SystemError: Parent module '' not loaded, cannot perform relative import”。

        先看一下目录结构:

    wKioL1RmF5KTx50sAAEPQLnI4vw282.jpg



    OperateExcel.py

    #!F:/Python/python
    
    
    from ..Model.ObjectFile import *
    
    def showMessage():
    	print('OperateExcel file is Load')


    ObjectFile.py

    def showMessage():
    	print('Object File is running!')


    在python环境调用提示:

    Traceback (most recent call last):

      File "Operate/OperateExcel.py", line 4, in <module>

        from ..Model.ObjectFile import *

    SystemError: Parent module '' not loaded, cannot perform relative import


    查阅了一些资料,发现问题在于引用路径上,就是OperateExcel.py 的

    from ..Model.ObjectFile import *


    修改OperateExcel.py 查看一下,该文件在启动时加载了哪些路径。

    修改代码如下:

    #!F:/Python/python
    
    
    # from ..Model.ObjectFile import *
    
    # def showMessage():
    # 	print('OperateExcel file is Load')
    
    
    import sys,pprint
    
    pprint.pprint(sys.path)

    打印输出默认调用路径:

    ['F:\\Python\\Project\\ExcelOperateProject\\Operate',

     'C:\\Windows\\system32\\python33.zip',

     'C:\\Python33\\DLLs',

     'C:\\Python33\\lib',

     'C:\\Python33',

     'C:\\Python33\\lib\\site-packages']


    问题貌似明朗化,加载时未找到加载的路径。曾经尝试修改Operate目录下的__init__.py文件(该文件默认为空)。

    import sys
    sys.pate.append('F:\\Python\\Project\\ExcelOperateProject\\Model',
     
    )

    调用OperateExcel.py输入如下:

    ['F:\\Python\\Project\\ExcelOperateProject\\Operate',

     'C:\\Windows\\system32\\python33.zip',

     'C:\\Python33\\DLLs',

     'C:\\Python33\\lib',

     'C:\\Python33',

     'C:\\Python33\\lib\\site-packages']

    (对于__init__还停留在初级阶段,如有使用不当还请批评指正)。


    问题原因已经明确,即文件调用未加载指定路径,造成编译错误。经过度娘查询一些以往大神的经验。发现主要问题在于同级module无法直接调用。需要先找到上一级的module而后查询到调用的内容。前提你的执行文件目录不能与你的引入文件同级。所以我修改一下目录结构如下:

    wKioL1RmzWCwxHhgAACPBAuBq8c551.jpg


    将Model目录、Operate目录封装到package目录下,并且在package目录下创建空的__init__.py文件(这个很重要,否则在跨模块调用时会提示错误,因编译程序未将package看作是module)。然走在ExcelOperateProject目录下建立main.py调用package/Operate/OperateExcel.py代码如下:

    from package.Operate import OperateExcel
    
    OperateExcel.showMessage()

    调用成功!哇哈哈!


关键字