有一个 python 模块,在 运行 之前安装它自己的依赖项
Having a python module, install its own dependencies before running
很多软件包需要系统用户先安装一套依赖包才能使用。 (这是一个不特定于 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
时才有意义。
你永远不应该这样做 - pip 没有依赖解析,所以不能保证你会得到某个版本。应使用 setup.py
、requirements.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
而不仅仅是缺少的模块的理由。
很多软件包需要系统用户先安装一套依赖包才能使用。 (这是一个不特定于 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
时才有意义。
你永远不应该这样做 - pip 没有依赖解析,所以不能保证你会得到某个版本。应使用 setup.py
、requirements.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
而不仅仅是缺少的模块的理由。