我想從所有導入的(自寫)模塊中獲取一個列表,然後以編程方式通過PIP獲取它們。有沒有辦法做到這一點?Python提取導入並使用pip下載它們
我想通過打開(model.py)解析文件提取導入語句,然後是子流程PIP,但是有沒有更好的方法?
編輯: 這有助於完成PIP: http://blog.ducky.io/python/2013/08/22/calling-pip-programmatically/
我想從所有導入的(自寫)模塊中獲取一個列表,然後以編程方式通過PIP獲取它們。有沒有辦法做到這一點?Python提取導入並使用pip下載它們
我想通過打開(model.py)解析文件提取導入語句,然後是子流程PIP,但是有沒有更好的方法?
編輯: 這有助於完成PIP: http://blog.ducky.io/python/2013/08/22/calling-pip-programmatically/
根據來自Rob答案,我來到了以下解決方案:
def satisfy_dependencies(path_to_dir):
# Generate requirements.txt using pipreqs and then use pip to fetch the requirements
proc = Popen(["pipreqs", path_to_dir, "--savepath", os.path.join(path_to_dir, "requirements.txt"), "--force"])
while proc.poll() is None:
time.sleep(0.1)
if os.path.exists(os.path.join(path_to_dir, "requirements.txt")):
pip = Popen(["pip", "install", "-r", os.path.join(path_to_dir, "requirements.txt")])
while pip.poll() is None:
time.sleep(0.1)
os.remove(os.path.join(path_to_dir, "requirements.txt"))
很多子處理,但在我的情況做了這項工作。 我會回來的。
你可以用try/except條件包裝它。
類似:
import pip
while True:
try:
import mymodule
break
except ImportError as e:
dependency = str(e).split(" ")[-1]
if dependency == 'mymodule':
break
pip.main(['install', dependency])
我的想法:
嘗試導入 - 如果你沒有安裝,如果失敗,則應該增加一個ImportError
的依賴錯誤消息的最後一個單詞應該是您需要的模塊的名稱,請按照您鏈接的頁面中的建議使用pip進行安裝。
你也可以,如果你的模塊不存在得到一個ImportError - 所以我們的測試是,打破
我能想象一個問題,這取決於PIP模塊(我卻沒有使用)如果一個模塊有不同的導入名點子的名稱,例如MySQLdb的,這是通過$安裝PIP安裝MySQL-python的