看了一段Python的基础视频,正好赶上单位需要做个小工具。索性拿它练练手,刚刚开动就遇到一个新的问题:目录引用。简单的说,就是将不同的功能代码,分到不同的目录文件中,代码中涉及到同级目录调用,问题就出来了“SystemError: Parent module '' not loaded, cannot perform relative import”。
先看一下目录结构:
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而后查询到调用的内容。前提你的执行文件目录不能与你的引入文件同级。所以我修改一下目录结构如下:
将Model目录、Operate目录封装到package目录下,并且在package目录下创建空的__init__.py文件(这个很重要,否则在跨模块调用时会提示错误,因编译程序未将package看作是module)。然走在ExcelOperateProject目录下建立main.py调用package/Operate/OperateExcel.py代码如下:
from package.Operate import OperateExcel OperateExcel.showMessage()
调用成功!哇哈哈!