必要时安装库

2024-04-19 17:47:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

问题是我真的不知道如何将包的名称作为一个可以由import调用的值传入 我想把一个字符串转换回来,但那似乎比我想的要复杂


Tags: pip函数代码nameimportpackagesmartdef
1条回答
网友
1楼 · 发布于 2024-04-19 17:47:30

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

这种方法还存在其他一些问题:

  • 导入名称并不总是与分发名称相对应。例如,dateutil模块由python-dateutil发行版提供。你知道吗
  • 如果您尝试从另一个模块使用smart_import,则会将名称导入错误的命名空间。你知道吗
  • 一些发行版导出多个顶级导入,例如setuptools提供setuptoolseasy_installpkg_resources。你知道吗
  • 在某些情况下,pip本身可能无法安装。你知道吗
  • 脚本可能没有安装包的权限。你知道吗
  • 用户可能想用 user显式地将发行版安装到homedir中,而您的脚本本身却不知道这一点。你知道吗
  • pip的调用可能需要根据您是否在virtualenv中而改变。你知道吗
  • 安装可能会尝试拉入依赖项,从而导致与用户已安装的其他发行版冲突。你知道吗
  • ide很可能看不到动态导入的模块在那里,并且可能会在它们的后续使用中添加一个无法解析的名称。你知道吗

该怎么做:

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

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

相关问题 更多 >