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



许多软件包要求系统用户在使用软件之前先安装一组依赖项。(这是一个一般性的问题,不是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或操作系统的软件包系统或内部公司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的理由,而不仅仅是缺少的模块。

最新更新