【问题标题】:install a library if necessary必要时安装库
【发布时间】:2018-04-04 12:51:04
【问题描述】:

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

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

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

【问题讨论】:

  • 这个函数怎么调用?
  • Eh....wheels 是解决此问题的更好方法
  • 初学者应该习惯安装包的想法。根据系统配置,主要是权限设置,您的脚本可能无法自行安装包,这是正常的。
  • 必须安装库来执行或编译所有语言的代码是极其常见的。对于他们来说,必须安装它真的不应该被认为是一个问题。唯一的例外是最终用户。但是,作为参考,您可能希望使用 importlib。

标签: python pip python-import


【解决方案1】:

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

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

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

该怎么做:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多