背景如下:
github上找的一個 Python 版開源庫 SDK 不滿足需求,copy 了該 SDK 進行修改並將該庫保存在公司內部的git服務器上供小組人員使用。除了該 Python 版 SDK 之外,還修改了一份公司內部提供的 Golang 版本 SDK,兩個語言版本的 SDK 放在一個倉庫 groups 下。因此,為了區分版本,分別使用"XXX-go"和"XXX-python"目錄來進行存儲。
Python版本倉庫目錄大致如下:
├── xxx-python
| └── yyy
| ├── bar.py
| ├── foo.py
| └── __init__.py
└── task.py
xxx-python倉庫目錄下有yyy目錄,yyy目錄是從github上copy的 SDK,與xxx-python倉庫目錄同path下,有個task.py的腳本需要導入yyy SDK,大致代碼如下:
import yyy yyy.client() ...
這里有個問題是,在task下面不能直接導入yyy包,因為yyy目錄是在xxx-python目錄下的,因此需要把xxx-python作為yyy包的父級包進行導入,要么就把task.py文件移入到xxx-python目錄下。
由於task.py在使用yyy SDK時,該SDK總是自動緩存一些snapshot,會創建目錄,不想在xxx-python中總是出現這個snapshot目錄,也不想修改倉庫的.gitignore文件。
那只能作為父級包導入xxx-python,但是xxx-python含有特殊字符,沒法作為包名導入。
解決辦法:
import sys sys.path.append('xxx-python') import yyy yyy.client()
在Python的模塊搜索路徑中手動追加該包含特殊字符的文件夾路徑,然后再導入實際的SDK包,讓Python解釋器能夠嘗試在xxx-python下查找包。
這個問題,下午困惑了我兩個小時沒解決,晚上在stackoverflow找到了答案,然后作了紀錄,寫下了這篇blog,但是寫完我才想起,這是Python基礎知識,很久以前讀Python教程那本書時,就說過模塊搜索路徑的知識點,只是太久忘記了.......