许多软件包要求系统用户在使用软件之前先安装一组依赖项。 (这是一个不是特定于python的一般性问题,但我会在python的上下文中发言。)。如果尚未安装依赖项,我们是否可以在执行代码之前使python模块安装自己的依赖项。这可以在system
或subprocess
来电的帮助下实现,但我很少看到有人这样做。
例如,假设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
时才有意义。
答案 0 :(得分:3)
你永远不应该这样做 - pip没有依赖性解析,所以不能保证你会得到某个版本。应使用setup.py
,requirements.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
,而不仅仅是丢失的模块。