有一个 python 模块,在 运行 之前安装它自己的依赖项

Having a python module, install its own dependencies before running

很多软件包需要系统用户先安装一套依赖包才能使用。 (这是一个不特定于 python 的一般性问题,但我将在 python 的上下文中发言。)如果依赖项尚未安装,我们不能让 python 模块在执行代码之前安装它自己的依赖项。这应该可以在 systemsubprocess 调用的帮助下实现,但我很少看到有人这样做。

例如,假设 lib 是一个 python 库,需要在 python 文件中使用 main.py :

import os
try:
    import lib
except:
    os.system('pip install pdir')
    import lib

# Can make use of lib now

这种方法有什么潜在的问题吗?做这样的事情会给大项目带来问题吗?

注意:这里的好处是使用该文件的用户不必单独安装依赖项,他可以简单地运行 python main.py。我意识到的第二件事是,这种方法只有在使用 virtualenv 时才有意义。

你永远不应该这样做 - pip 没有依赖解析,所以不能保证你会得到某个版本。应使用 setup.pyrequirements.txt 或其他方法安装依赖项。

您也不需要用户权限或 sudo 来安装 运行 代码的软件包。用户应该知道安装你的包所需的包,因为它们可能来自 PyPI 或 OS 的包系统或公司内部的 PyPI 镜像 - 静默安装依赖项不是一个好主意案例.

您总是可以考虑使用更高级的打印语句来通知用户。

try:
    import ConfigParser

except ImportError as err:
        print '\n'.join([i + ''.join(str(err).split(' ')[-1:]) for i in ['$ pip install ', '$ easy_install ']])

您可以推荐他们以这种方式安装缺少的包。

$ pip install ConfigParser
$ easy_install ConfigParser

此外,您可以考虑让 ImportError 成为推荐用户 运行 他们的 ./setup.py./INSTALL 而不仅仅是缺少的模块的理由。