必要时安装库

Fra*_*man 3 python pip python-import

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

def smart_import(package_name):
    try:
        import package_name
    except ImportError:
        import pip
        pip.main(['install', package_name])
Run Code Online (Sandbox Code Playgroud)

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

wim*_*wim 9

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

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

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

该怎么做:

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

Python的包装用户指南是描述如何创建和上传自己的分布的初学者友好的资源.