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

时间:2015-02-28 03:18:47

标签: python virtualenv dependency-management

许多软件包要求系统用户在使用软件之前先安装一组依赖项。 (这是一个不是特定于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时才有意义。

2 个答案:

答案 0 :(得分:3)

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

您也不应该只是为了运行代码而需要用户权限或sudo来安装软件包。用户应该知道安装软件包所需的软件包,因为它们可能来自PyPI或操作系统的软件包系统或内部公司的PyPI镜像 - 在这种情况下,静默安装依赖项并不是一个好主意。

答案 1 :(得分:0)

您始终可以考虑使用更高级的print语句来通知用户。

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,而不仅仅是丢失的模块。