我想从一个(自写)模块的所有导入中获取一个列表,并通过PIP以编程方式获取它们。有没有办法做到这一点?
我想通过open(model.py)分析文件解压缩import语句然后再处理PIP,但是有更好的方法吗?
编辑: 这有助于PIP: http://blog.ducky.io/python/2013/08/22/calling-pip-programmatically/
答案 0 :(得分:2)
答案 1 :(得分:2)
你可以将它包装在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模块(我还没有使用过),如果一个模块具有不同的pip名称的导入名称,例如MySQLdb,它是通过$ pip install MySQL-python < / p>
答案 2 :(得分:1)
根据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"))
很多子处理,但在我的情况下做了工作。 我会回来的。