Python import同級module調用

    看了一段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()

調用成功!哇哈哈!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章