必要时安装库

时间:2018-04-04 12:51:05

标签: python pip python-import

我想发送一个我为同学感到自豪的简短代码,并意识到他无法运行它,因为他没有理由安装该库。 安装当然非常简单 - 但我意识到这可能经常发生,主要是初学者 - 想为它构建一个简单的功能:

def smart_import(package_name):
    try:
        import package_name
    except ImportError:
        import pip
        pip.main(['install', package_name])

问题是我真的不知道如何将包的名称作为可以通过import调用的值传递 想到将一个字符串转换回来,但这似乎比我想象的更复杂

1 个答案:

答案 0 :(得分:9)

由于许多原因,这是一个坏主意,主要原因是人们通常不希望Python函数调用自动尝试在他们的机器上安装软件。

以下是此方法存在的其他一些问题

  • 导入名称并不总是与分发名称对应。例如,dateutil模块由python-dateutil发行版提供。
  • 如果您尝试使用其他模块中的smart_import,则会将名称导入错误的命名空间。
  • 某些发行版导出多个顶级导入,例如setuptools提供setuptoolseasy_installpkg_resources
  • 在某些情况下,可能未安装pip本身。
  • 该脚本可能没有安装软件包的权限。
  • 用户可能希望使用--user明确地将分发版安装到其homedir中,并且您的脚本本身无法知道。
  • pip的调用可能需要根据您是否属于virtualenv而改变。
  • 安装可能会尝试引入依赖项,这会导致与用户安装的其他发行版冲突。
  • IDE很可能不会看到动态导入的模块存在,并且可能会潦草地强调它们后续用作无法解析的名称。

该怎么做:

将您的代码打包到自己的发行版中。写一个setup.py,在install_requires调用中使用setup参数提及依赖关系。请问您的同学pip install mypackage,并且将在安装时而不是在运行时收集依赖项。您可以将发布直接发送给他们(作为mypackage-0.1.tar.gz文件或wheel)。或者您可以将其上传到test pypi等索引。

Python Packaging User Guide是一个初学者友好的资源,描述了如何创建和上传自己的发行版。