检查模块是否存在,如果没有安装

dot*_*tty 22 python import module

我想检查模块是否存在,如果不存在,我想安装它.

我该怎么做?

到目前为止,我有这个代码,f如果模块不存在,它会正确打印.

try:
    import keyring
except ImportError:
    print 'f'
Run Code Online (Sandbox Code Playgroud)

小智 18

import pip

def import_or_install(package):
    try:
        __import__(package)
    except ImportError:
        pip.main(['install', package])       
Run Code Online (Sandbox Code Playgroud)

此代码只是尝试导入一个包,其中包的类型为str,如果无法,则调用pip并尝试从那里安装它.

  • 它对我不起作用,我收到下一个错误“ {模块'pip'没有属性'main'}” (5认同)
  • 尝试执行`pip.main(['install', '--user', package])`。 (2认同)

Div*_*ava 14

注意:Ipython / Jupyter 特定解决方案。

在使用笔记本/在线内核时,我通常使用系统调用来完成。

try:
  import keyring
except:
  !pip install keyring
  import keyring
Run Code Online (Sandbox Code Playgroud)

PS One 不妨致电conda installmamba install代替。


use*_*312 12

这是应该怎么做,如果我错了,请纠正我.然而,Noufal似乎在这个问题的另一个答案中证实了这一点,所以我猜它是对的.

在编写setup.py我编写的一些脚本的脚本时,我依赖于我的发行版的包管理器来为我安装所需的库.

所以,在我的setup.py文件中,我这样做了:

package = 'package_name'
try:
    return __import__(package)
except ImportError:
    return None
Run Code Online (Sandbox Code Playgroud)

所以,如果package_name安装,罚款,继续.否则,通过我调用的包管理器安装它subprocess.


Fra*_*uro 11

这种动态导入方法非常适用于您只想在未安装模块时打印消息的情况.自动安装模块应该像发送pip via那样完成subprocess.这就是为什么我们有setuptools(或分发).

我们有一些很好的包装教程,依赖检测/安装的任务就像提供一样简单install_requires=[ 'FancyDependency', 'otherFancy>=1.0' ].就是这样!

但是,如果你真的需要手工做,你可以setuptools用来帮助你.

from pkg_resources import WorkingSet , DistributionNotFound
working_set = WorkingSet()

# Printing all installed modules
print tuple(working_set)

# Detecting if module is installed
try:
    dep = working_set.require('paramiko>=1.0')
except DistributionNotFound:
    pass

# Installing it (anyone knows a better way?)
from setuptools.command.easy_install import main as install
install(['django>=1.2'])
Run Code Online (Sandbox Code Playgroud)