Python常用模塊——包&跨模塊代碼調用
一、包(Package)
當你的模塊文件越來越多,就需要對模塊文件進行划分,比如把負責跟數據庫交互的都放一個文件夾,把與頁面交互相關的放一個文件夾。
my_proj/
├── apeland_web #代碼目錄
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── my_proj #配置文件目錄
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
像上面這樣,一個文件夾管理多個模塊文件,這個文件夾就被稱為包
一個包就是一個文件夾,但該文件夾下必須存在init.py 文件, 該文件的內容可以為空,init.py用於標識當前文件夾是一個包。
這個init.py的文件主要是用來對包進行一些初始化的,當當前這個package被別的程序調用時,init.py文件會先執行,一般為空, 一些你希望只要package被調用就立刻執行的代碼可以放在init.py里。
二、跨模塊導入
目錄結構如下
my_proj
├── apeland_web
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── my_proj
├── settings.py
├── urls.py
└── wsgi.py
根據上面的結構,如何實現在apelandweb/views.py里導入myproj/settings.py
模塊?
直接導入的話,會報錯,說找到不模塊
是因為路徑找不到,my_proj/settings.py 相當於是apeland_web/views.py的父親(apeland_web)的兄弟(my_proj)的兒子(settings.py),settings.py算是views.py的表弟啦,在views.py里只能導入同級別兄弟模塊代碼,或者子級別包里的模塊,根本不知道表弟表哥的存在。這可怎么辦呢?
答案是添加環境變量,把父親級的路徑添加到sys.path中,就可以了,這樣導入 就相當於從父親級開始找模塊了。
apeland_web/views.py中添加環境變量
import sys ,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印當前被執行的模塊.py文件相對路徑,注意是相對路徑
print(BASE_DIR) # 輸出是/Users/alex/PycharmProjects/apeland_py_learn/day4_常用模塊/my_proj
sys.path.append(BASE_DIR)
from my_proj import settings
print(settings.DATABASES)
三、官方推薦的跨目錄導入方法
雖然通過添加環境變量的方式可以實現跨模塊導入,但是官方不推薦這么干,因為這樣就需要在每個目錄下的每個程序里都寫一遍添加環境變量的代碼。
官方推薦的玩法是,在項目里創建個入口程序,整個程序調用的開始應該是從入口程序發起,這個入口程序一般放在項目的頂級目錄。
這樣做的好處是,項目中的二級目錄 apeland_web/views.py中再調用他表親my_proj/settings.py時就不用再添加環境變量了。
原因是由於manage.py在頂層,manage.py啟動時項目的環境變量路徑就會自動變成….xxx/my_proj/這一級別