看了一段Python的基礎視頻,正好遇上單位須要作個小工具。索性拿它練練手,剛剛開動就遇到一個新的問題:目錄引用。簡單的說,就是將不一樣的功能代碼,分到不一樣的目錄文件中,代碼中涉及到同級目錄調用,問題就出來了「SystemError: Parent module '' not loaded, cannot perform relative import」。
python
先看一下目錄結構:
app
OperateExcel.pyide
#!F:/Python/python from ..Model.ObjectFile import * def showMessage(): print('OperateExcel file is Load')
ObjectFile.py工具
def showMessage(): print('Object File is running!')
在python環境調用提示:orm
Traceback (most recent call last):視頻
File "Operate/OperateExcel.py", line 4, in <module>blog
from ..Model.ObjectFile import *ip
SystemError: Parent module '' not loaded, cannot perform relative importget
查閱了一些資料,發現問題在於引用路徑上,就是OperateExcel.py 的it
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()
調用成功!哇哈哈!