二哥出品,必是精品。歡迎關注評論和交流。
無論是用Python做自動化測測試還是用Python做開發,都會有自己特定的工程目錄,而在每一個工程目錄下面存放的就是一個個包,包裡面放得就是模組。那麼他們之間如何呼叫才會實現程式碼之間的交流無阻礙呢?
很多朋友可能會說,這無外乎就三種方法嗎?有什麼可以討論的呢。其實,不然。
│ README。md│ requirements。txt│ setup。py│ __init__。py│├─bin│ foo。py│ __init__。py│├─conf│ settings。py│ __init__。py│├─docs│ refer。txt│ __init__。py│└─foo │ main。py │ __init__。py │ └─tests test1。py test_main。py __init__。py
以上圖所示的程式碼結構為例。
test1。py如何呼叫test_main。py的方法呢?foo。py如何呼叫conf。py裡面的方法呢?
同一層級下模組匯入
from test_main import test_fun1from test_main import *import test_main
似乎就是這樣的簡單,這三種方式都是可以的呀!
咳咳。說明一下。
當模組在同一層級目錄下的時候,的確是用這樣的就可以實現的。
比較推薦from test_main import test_fun1的方式,可以同時匯入多個模組或者方法。
但是,當目錄結構比較複雜的時候,就需要考慮更多一些了,下面我們就來看一看。
包(Package)
當你的模組檔案越來越多,就需要對模組檔案進行劃分,比如把負責跟資料庫互動的都放一個資料夾,把與頁面互動相關的放一個資料夾。
像上面這樣,一個Foo下多個模組檔案,這個資料夾就被稱為包。
一個包就是一個資料夾,該資料夾下必須存在__init__檔案,可以為空,標識當前資料夾是一個包。
這個__init__的檔案主要是用來對包進行一些初始化的,噹噹前這個 package被別的程式呼叫時, __init__。py檔案會先執行。
__init__。py一般為空,一些你希望只要 package被呼叫就立刻執行的程式碼可以放在裡面,一會後面會演示。
當在setup。py中import conf的時候,會出現以下結果,即conf的__init__。py被執行了。
跨模組匯入
接著上面的目錄結構來看,setup。py如何呼叫main。py裡面的配置呢?
根據上面的結構,如何實現在bin下的foo。py中匯入conf。py的資料呢?
直接匯入的話,會報錯,說找到不模組。
方法一,新增絕對路徑到環境變數中。
問題:多個地方匯入時會很麻煩,同時代碼無法移植,別人在其他電腦上維護程式碼時,沒有相同路徑就會報錯的,所以不推薦。
#!/usr/bin/env pythonimport sysbase_dir = “D:/python/python_210710/Foo”sys。path。append(base_dir)from conf import settingsdef foo_page(): print(“——-foo page————-”) print(settings。data)foo_page()
方法二 ,利用os。path獲取路徑。
#!/usr/bin/env pythonimport sys,osbase_dir = os。path。abspath(os。path。dirname(os。path。dirname(__file__)))sys。path。append(base_dir)from conf import settingsdef foo_page(): print(“——-foo page————-”) print(settings。data)foo_page()
方法三 ,程式入口為setup。py。
1、在setup。py中from bin import foo
2、在bina下的foo。py中from conf import settings
3、程式從setup。py啟動
具體展示
conf的資料
foo。py中from conf import settings
setup。py中from bin import foo
此時,在foo。py中讀取資料的時候,就不需要加環境變量了,這也是官方推薦的一種方法。歡迎嘗試。