假设您已经在python发行版上安装了pip或easy_install,我想知道如何在脚本本身内的用户目录中安装必需的包。
据我所知,pip也是一个python模块,因此解决方案应该如下:
try:
import zumba
except ImportError:
import pip
# ... do "pip install --user zumba" or throw exception <-- how?
import zumba
我缺少的是从python内部执行“pip install --user zumba”,我不想使用os.system()
来执行此操作,因为这可能会产生其他问题。
我认为有可能......
答案 0 :(得分:17)
感谢@Joop,我能够得到正确的答案。
try:
import zumba
except ImportError:
import pip
pip.main(['install', '--user', 'zumba'])
import zumba
一个重要的评论是,这将在不需要root访问权限的情况下工作,因为它会将模块安装在用户目录中。
不确定它是否适用于二进制模块或需要编译的模块,但它显然适用于纯python模块。
现在您可以编写自包含脚本而不用担心依赖项。
答案 1 :(得分:7)
从pip版本> = 10.0.0开始,由于内部软件包的重组,上述解决方案将不起作用。现在,在脚本中使用pip的新方法如下:
try: import abc
except ImportError:
from pip._internal import main as pip
pip(['install', '--user', 'abc'])
import abc
答案 2 :(得分:3)
我想要注意的是,当前接受的答案可能会导致应用程序名称冲突。从应用程序命名空间导入并不能全面了解系统上安装的内容。
更好的方法是:
import pip
packages = [package.project_name for package in pip.get_installed_distributions()]
if 'package' not in packages:
pip.main(['install', 'package'])