1. 程式人生 > 其它 >迴圈匯入問題,模組的搜尋路徑與優先順序,軟體開發目錄規範,包

迴圈匯入問題,模組的搜尋路徑與優先順序,軟體開發目錄規範,包

**迴圈匯入問題**

迴圈匯入問題.py檔案

import m1
print(m1.current_user)
m1.login()
print(m1.current_user)

m1.py檔案

from m2 import f2
import os

def login():
    while True:
        inp_user = input('username>>>: ').strip()
        inp_pwd = input('password>>>: ').strip()

        if inp_user == 'egon' and inp_pwd == '123':
            print('登入成功')

            os.environ['username'] = inp_user
            break
        else:
            print("登入失敗")

m2.py檔案

import os
def f2():
    print('==============>f2')
**模組的搜尋路徑與優先順序**

1、記憶體
2、內建模組
3、sys.path

例1
import m3
import time

m3.f3()
time.sleep(10)
 
import m3
m3.f3()   #把檔案從資料夾裡刪除10s內還能執行,之後執行會報錯

例2
import time  #觸發的其實是內建函式,不會觸發time.py檔案

建立time.py檔案 
print('自己的time模組') # 路徑在sys.path
# 自己設定的模組名不要跟內建的衝突

例3:(有點麻煩)
import sys   
#新增對應資料夾絕對路徑到sys.path成為解鎖路徑之一
 就可以訪問不在當前路徑下的檔案
sys.path.append(r'D:\程式碼\aaa')
sys.path.append(r'D:\程式碼\bbb')
sys.path.append(r'D:\程式碼\ccc')

import m4
import m5
import m6

m4.f4()
m5.f5()
m6.f6()

import m4   #m4.py檔案內容(路徑 D:\程式碼\aaa)
m4.f4()

import m5   #m4.py檔案內容(路徑 D:\程式碼\bbb)
m5.f5()

import m6   #m4.py檔案內容(路徑 D:\程式碼\ccc)
m6.f6()

例4:(優化例子3)
import sys
# sys.path.append(r'D:\全棧18期\day16\程式碼')

from aaa import m4
from bbb import m5
from ccc import m6

m4.f4()
m5.f5()
m6.f6()

例5:
**重要結論:**如果被匯入的模組是在執行程式所在的資料夾下,那麼無需處理環境變數,
以執行程式所在的資料夾為起始點進行查詢即可

**強調:**
1、匯入語句中的點
# 如果是起始位置那個點代表當前資料夾(相對匯入只能在**包**裡用)
# 點的左邊必須是個資料夾
# 如果是中間位置那個點代表的是路徑分割符
2、使用語句中的點代表的是問某一個名稱空間要名字

# "\"路徑分隔符在windows系統中使用 
  "/"路徑分隔符在linux和unix系統中使用
   pycharm統一用". "pycharm幫你區分
   匯入語句的"."代表路徑分隔符
   
#   ddd/eee/fff (go語言中用"/")
from ddd.eee.fff import m7

m7.f7()

# 當被匯入的模組存在於執行程式所在檔案下,此時沒必要在處理環境變量了

例6:

import sys
sys.path.append(r'D:\day03')
import m8
m8.f8()
**軟體開發目錄規範(僅供參考,沒有統一標準)**

假設我要開發一個叫ATM軟體
ATM為頂級目錄名字
# 執行程式放在bin(binary)下面
# corf 配置檔案——》定製化的檔案(比如產生的日誌放在一個路徑下面)
# core 核心程式碼 ,被匯入的模組丟這裡
# lib  共享一些功能 庫(模組),自定義的庫,存放功能的倉庫
# logs 專門存放日誌的資料夾
# readme 說明手冊

bin目錄下start.py檔案

#執行程式放在bin下面
import sys
sys.path.append(r'D:\ATM')

from core.src import run

if __name__ == '__main__':
    run()

conf目錄下settings.py

**知識點**

# print(__file__) 當前檔案的絕對路徑
# os.path.dirname(__file__)  返回指令碼路徑

**舉例說明**

內容
import os  #匯入標準庫os(作業系統介面模組)
1. print(__file__)
2. print(os.path.dirname(__file__))
3. print( os.path.dirname(os.path.dirname(__file__)))

對應結果:
1. D:\PycharmProject\ATM\conf\settings.py
2. D:\PycharmProject\ATM\conf
3. D:\PycharmProject\ATM
# 配置檔案——》定製化的檔案(比如產生的日誌放在一個路徑下面)

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

LOG_PATH = r'%s\logs\access.log' % BASE_DIR

# 配置路徑寫活了

core目錄下src.py

from lib.common import log

def logout():
    print("退出".center(50,'*'))
    exit()

def login():
    print('登入'.center(50,'*'))
    log("egon剛剛登入了")

def register():
    print('註冊'.center(50,'*'))

def transfer():
    print('轉賬'.center(50,'*'))
    #log("egon剛剛給劉sir轉了10個億")

def withdraw():
    print('提現'.center(50,'*'))

def pay():
    print('支付'.center(50,'*'))

func_dic = {
    '0': ['退出',logout],
    '1': ['登入',login],
    '2': ['註冊',register],
    '3': ['轉賬',transfer],
    '4': ['提現',withdraw],
    '5': ['支付',pay],}

def run():
    while True:
        for k in func_dic:
            print(k,func_dic[k][0])

        choice = input("請輸入指令編號: ").strip()

        if choice in func_dic:
            func_dic[choice][1]()
        else:
            print("輸入的指令錯誤")

lib目錄下common.py

import time
from conf import settings

def log(msg):
    with open(r'%s' % settings.LOG_PATH,mode='at',encoding='utf-8') as f:
        f.write("%s %s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"),msg))

# 日誌路徑換成 配置檔案可定製

python package

包含_int_.py檔案的資料夾,被匯入使用的
_int_.py檔案 包的替代品,用來匯入、包使用
表面上導包實際上就是在導_int_.py
資料夾當成一個模組,用資料夾組織一堆子模組,資料夾還可以當模組匯入
包(xxx) xxx.名字,都來自於_int_.py檔案

包的使用1

mmm.py

def f1():
    print('mmm.f1')

def f2():
    print('mmm.f2')

def f3():
    print('mmm.f3')

def f4():
    print('mmm.f4')

def f5():
    print('mmm.f5')

def f6():
    print('mmm.f6')

def f7():
    print('mmm.f7')

def f8():
    print('mmm.f8')

def f9():
    print('mmm.f9')

執行檔案

import mmm

mmm.f1()
mmm.f2()
mmm.f3()

mmm.f4()
mmm.f5()
mmm.f6()

mmm.f7()
mmm.f8()
mmm.f9()

包的使用2

執行檔案

import mmm

mmm.f1()
mmm.f2()
mmm.f3()

mmm.f4()
mmm.f5()
mmm.f6()

mmm.f7()
mmm.f8()
mmm.f9()

mmm.kkk()

int.py

from .m1 import f1,f2,f3
from .m2 import f4,f5,f6
from .m3 import f7,f8,f9

from .aaa.bbb.m4 import kkk

m1.py

def f1():
    print('mmm.f1')

def f2():
    print('mmm.f2')

def f3():
    print('mmm.f3')

m2.py

def f4():
    print('mmm.f4')

def f5():
    print('mmm.f5')

def f6():
    print('mmm.f6')

m3.py

def f7():
    print('mmm.f7')

def f8():
    print('mmm.f8')

def f9():
    print('mmm.f9')