Python提取导入并使用pip下载它们

时间:2017-03-08 14:14:51

标签: python pip

我想从一个(自写)模块的所有导入中获取一个列表,并通过PIP以编程方式获取它们。有没有办法做到这一点?

我想通过open(model.py)分析文件解压缩import语句然后再处理PIP,但是有更好的方法吗?

编辑: 这有助于PIP: http://blog.ducky.io/python/2013/08/22/calling-pip-programmatically/

3 个答案:

答案 0 :(得分:2)

我知道有两种选择。

  1. pigar
  2. pipreqs
  3. 两者都将从您的项目中提取导入,并为您提供一个可以与pip一起使用的requirements.txt文件。

答案 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])

我的想法:

  1. 尝试导入 - 如果您没有安装依赖项,则应引发ImportError

  2. 如果失败,错误消息的最后一个字应该是您需要的模块的名称,请按照您链接的页面中的建议使用pip进行安装。

  3. 如果你的模块不存在,你也可能会得到一个ImportError - 所以我们测试并断开

  4. 我可以想象一个问题,取决于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"))

很多子处理,但在我的情况下做了工作。 我会回来的。