當你的模塊文件愈來愈多,就須要對模塊文件進行劃分,好比把負責跟數據庫交互的都放一個文件夾,把與頁面交互相關的放一個文件夾。python
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
像上面這樣,一個文件夾管理多個模塊文件,這個文件夾就被稱爲包web
一個包就是一個文件夾,但該文件夾下必須存在init.py 文件, 該文件的內容能夠爲空,init.py用於標識當前文件夾是一個包。數據庫
這個init.py的文件主要是用來對包進行一些初始化的,噹噹前這個package被別的程序調用時,init.py文件會先執行,通常爲空, 一些你但願只要package被調用就馬上執行的代碼能夠放在init.py裏。app
目錄結構以下url
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
模塊?spa
直接導入的話,會報錯,說找到不模塊code
是由於路徑找不到,my_proj/settings.py 至關因而apeland_web/views.py的父親(apeland_web)的兄弟(my_proj)的兒子(settings.py),settings.py算是views.py的表弟啦,在views.py裏只能導入同級別兄弟模塊代碼,或者子級別包裏的模塊,根本不知道表弟表哥的存在。這可怎麼辦呢?blog
答案是添加環境變量,把父親級的路徑添加到sys.path中,就能夠了,這樣導入 就至關於從父親級開始找模塊了。it
apeland_web/views.py中添加環境變量class
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/這一級別