修改Python/PIP以在导入失败时自动安装模块

Pas*_*ten 7 python automation pip

有没有办法修改python/pip,每当导入在运行时失败,它会尝试从pip安装模块(同名)然后导入模块?

我会说这是一个更好的默认值而不是抛出一个错误.如果从pip加载模块后发生任何问题,那么它也会抛出错误,类似于我注意到我无法导入的东西,尝试pip install然后得到相同的错误消息.

我知道我们可以requirements.txt用来捆绑一个包,但我是从"客户端"(运行脚本的人)而不是"提供者"(提供脚本的人)角度谈论的; 也就是说,作为客户端,我希望能够导入任何脚本并自动解决依赖关系.

我知道这可能会带来麻烦,但每当我看到一个ImportError时,我都会尝试使用pip install该模块.只有在pip安装后模块不能正常工作"我才能提出进一步的问题".

我想到了像python进程"内置"的这个片段:

def getDirectoryOfInterpreter(p):
    return "someway to return the directory"

try:
    import somemodule
except ImportError:
    os.system(getDirectoryOfInterpreter('THIS_INTERPRETER_BINARY') + ' pip install ' + "MODULE_NAME")
    import somemodule
Run Code Online (Sandbox Code Playgroud)

Ant*_*hon 12

使用时,您可以使用pipimport执行此操作virtualenv.它可能适用于系统python,如果你有适当的权限来编写必要的目录(至少site-packages,你的导入可能有一些命令,pip试图把某些地方放在PATH中).因为总是使用virtualenvs为你自己的开发是好的做法,我从来没有尝试过使用pipimport系统python.

您需要手动将pipimport导入virtualenv:

virtualenv venv
source venv/bin/activate
pip install pipimport
Run Code Online (Sandbox Code Playgroud)

然后创建一个autopipimport.py首先在任何模块中导入的文件:

# import and install pipimport
import pipimport
pipimport.install()
Run Code Online (Sandbox Code Playgroud)

现在,在任何其他.py文件中,您可以执

import autopipimport
import some.package.installable.by.pip
Run Code Online (Sandbox Code Playgroud)

我曾尝试过(好奇心自动)将两条与pipimport相关的行添加venv/lib/python2.7/site.py到自动"加载",但那是在链的早期并没有奏效.

pipimport将只尝试使用pip一次安装特定模块,存储有关.pipimport-ignore文件中已尝试的内容的信息(venv除非不可写,否则应该在下面).

  • 请注意,这需要包名称与PyPI上的项目名称匹配; `from bs4 import BeautifulSoup`将找不到它注册的`beautifulsoup4`项目. (2认同)