Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如有必要,请安装库_Python_Pip_Python Import - Fatal编程技术网

Python 如有必要,请安装库

Python 如有必要,请安装库,python,pip,python-import,Python,Pip,Python Import,我想向一位同学发送一段我引以为傲的短代码,他意识到他无法运行它,因为他没有理由安装这个库。 安装当然非常简单-但我意识到这可能经常发生,主要是初学者-想要为它构建一个简单的功能: def smart_import(package_name): try: import package_name except ImportError: import pip pip.main(['install', package_name]) 问题是

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

def smart_import(package_name):
    try:
        import package_name
    except ImportError:
        import pip
        pip.main(['install', package_name])
问题是,我真的不知道如何将包的名称作为可以通过导入调用的值传递
考虑过将字符串转换回来,但这似乎比我想的更复杂,这是一个坏主意,原因有很多,主要原因是人们通常不希望Python函数调用自动尝试在他们的机器上安装软件

此方法还存在一些其他问题

  • 导入名称并不总是与分发名称相对应。例如,
    pythondateutil
    发行版提供了
    dateutil
    模块
  • 如果尝试从另一个模块使用
    smart\u import
    ,则会将名称导入错误的命名空间
  • 一些发行版导出多个顶级导入,例如
    setuptools
    提供
    setuptools
    easy\u install
    ,以及
    pkg\u资源
  • 在某些情况下,
    pip
    本身可能无法安装
  • 脚本可能没有安装程序包的权限
  • 用户可能希望使用
    --user
    显式地将分发版安装到其homedir中,而您的脚本本身却不知道这一点
  • pip
    的调用可能需要根据您是否在virtualenv中进行更改
  • 安装可能试图引入依赖项,这会导致与用户安装的其他发行版发生冲突
  • IDE很可能看不到动态导入的模块存在,并且可能会在其后续使用的无法解析的名称下面加上斜线
该怎么办:

将代码打包到自己的发行版中。编写一个
setup.py
,在
setup
调用中使用
install\u requires
参数来说明依赖项。请您的同学
pip安装mypackage
,依赖项将在安装时而不是运行时收集。您可以直接将您的分发内容发送给他们(作为
mypackage-0.1.tar.gz
文件或电子邮件)。或者您可以将其上载到索引,例如


这是一个初学者友好的资源,介绍如何创建和上传您自己的发行版。

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