解決辦法:
將項目所在的根目錄添加到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
更多分享請關注微信公眾號