python導包問題,這一篇就夠了


解決辦法:

將項目所在的根目錄添加到sys.path中

在入口文件中加入如下代碼:

import sys import os # 將 項目的根目錄添加到sys.path中
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) # 導入包或模塊
from db.mysql.my_connect import connect

一、背景

最近在寫Python自動化項目,遇到導包問題,明明導入了,運行時仍報 ImportError ,說明導包的姿勢不正確。
一個稍微復雜點的 Python 項目,都會有一定的目錄結構,也就聽上去高大上的框架結構,如下:
PythonProjectDemo
├─bin
│ main.py
│ __init__.py

├─common
│ __init__.py

├─db
│ │ __init__.py
│ │
│ ├─mongo
│ │ mongodb_connect.py
│ │ __init__.py
│ │
│ └─mysql
│ my_connect.py
│ __init__.py

└─view
__init__.py

目錄說明:
bin :程序運行入口
common:通用包
db:數據庫相關包,下面又包含MySQL和mongo兩個包
view:視圖包

如果想在bin/main.py中導入db相關的模塊,有的同學可能想這樣寫:
from db.mysql.my_connect import connect
無疑上面導入肯定會報錯,因為main.py 和 db下的mysql不在同一個路徑下。

二、Python 導入模塊工作原理
Python 在導入模塊時,會從一下路徑進行查詢:
1、程序的主目錄
2、PTYHONPATH目錄(如果已經進行了設置)
3、標准連接庫目錄
以上三個目錄組成了一個list,可通過sys.path來查看
在導包時就會從sys.path中進行搜索,如果搜索不到,則報ImportError

sys.path輸出如下

[ 'H:\PycharmProjects\untitled4\PythonProjectDemo\bin', 'E:\python\python35\python35.zip', 'E:\python\python35\DLLs', 'E:\python\python35\lib', 'E:\python\python35', 'E:\python\python35\lib\site-packages' ]

所以直接通過 from db.mysql.my_connect import connect 是無法導入的

 

三、解決辦法
思路:
1、將需要導入的包或者模塊添加到PTYHONPATH目錄(不推薦)
2、將需要導入的包或者模塊添加到sys.path中
在main.py中添加如下代碼
import sys
sys.path.append(r"H:\PycharmProjects\untitled4\PythonProjectDemo")
from db.mysql.my_connect import connect
運行未報錯
但是"H:\PycharmProjects\untitled4\PythonProjectDemo"代碼寫死了,不靈活。在別的機器上可能就無法運行了
我們可借助os模塊動態獲得項目路徑
__file__:運行文件的文件名,main.py

os.path.abspath(path) 獲取文件所在的絕對路徑, os.path.abspath(__file__) # H:\PycharmProjects\untitled4\PythonProjectDemo\bin\main.py
os.path.dirname(p) 獲取文件所在的目錄 os.path.dirname(os.path.abspath(__file__)) # H:\PycharmProjects\untitled4\PythonProjectDemo\bin
os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 獲取項目根目錄H:\PycharmProjects\untitled4\PythonProjectDemo

四、最終代碼

在main.py中的開始添加如下代碼

import sys import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from db.mysql.my_connect import connect

更多分享請關注微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM