Re: [問題] import 上層資料夾的module?

看板Python作者 (ccc)時間15年前 (2010/03/05 17:29), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串8/8 (看更多)
借用一下這個標題 我把原作者的架構延伸成下圖 (綠色代表可執行) Outside/ |- run_more_outside.py | `- Project/ |- __init__.py |- run_outside.py | `- Amazon/ |- __init__.py |- main.py |- GlobalFunc.py | |- Japan/ | |- __init__.py | `- JapanShow.py | `- TemplateFunc/ |- __init__.py `- TemplateShow.py 假設 JapanShow.py 是提供外部使用的函式 本身會用到上層的 GlobalFunc.py 及 TemplateFunc/TemplateShow.py 我試了一些不同的可能,並找到一個可行的做法 可是我並不是很喜歡這樣的程式寫法 想請問板友們有沒有漂亮的做法 底下是我試出來的結果 #--- JapanShow.py --- 主要修改藍色部分 if __name__ == '__main__': import sys sys.path.insert(0, '..') try: from .. import GlobalFunc from ..TemplateFunc import TemplateShow except ValueError: import GlobalFunc from TemplateFunc import TemplateShow def Show(mess): # API TemplateShow.Show("Japan", mess, GlobalFunc.Mark()) if __name__ == '__main__': Show('Japan') #--- GlobalFunc.py --- def Mark(): return '(Global)' #--- TemplateShow.py --- def Show(name, mess, mark): print '[%s] %s %s' % (name, mess, mark) #--- main.py --- from Japan import JapanShow JapanShow.Show('main') #--- run_outside.py --- from Amazon.Japan import JapanShow JapanShow.Show("outside") #--- run_more_outside.py --- from Project.Amazon.Japan import JapanShow JapanShow.Show("more_outside") 底下是各個檔案的執行結果: JapanShow.py: [Japan] Japan (Global) main.py: [Japan] main (Global) run_outside.py: [Japan] outside (Global) run_more_outside.py: [Japan] more_outside (Global) 以上是所有程式的內容 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.181.65

03/05 17:42, , 1F
如果只有Amazon資料夾以外的程式要使用API的話
03/05 17:42, 1F

03/05 17:43, , 2F
寫 from .. import xxx 就夠了
03/05 17:43, 2F

03/05 17:44, , 3F
但如果自己或main.py要使用API 就要加sys和except那段
03/05 17:44, 3F
※ 編輯: cccx 來自: 114.25.181.65 (03/05 17:47)

06/29 11:06, , 4F
推一下這篇,另外ValueError是不是應該改成ImportError ?
06/29 11:06, 4F

07/01 10:46, , 5F
我發現增加sys.path的方式,是以執行位置來開始算..
07/01 10:46, 5F

07/01 10:46, , 6F
也就是會造成在該目錄可以執行,到上一層就無法執行同程式
07/01 10:46, 6F
文章代碼(AID): #1BaCyMCC (Python)
文章代碼(AID): #1BaCyMCC (Python)