阅读本文大概需要 3 分钟。

写 Python 通常我们会怎样导包?可能大部分情况下都是用 import,但除了 import 你还会些什么呢?下面我们来介绍一些骚操作。

1. 直接 import

人尽皆知的方法,直接导入即可

>>> import os>>> os.getcwd()'/home/wangbm'

与此类似的还有,不再细讲

import ...import ... as ...from ... import ...from ... import ... as ...

一般情况下,使用 import 语句导入模块已经够用的。

但是在一些特殊场景中,可能还需要其他的导入方式。

下面我会一一地给你介绍。

2. 使用 __import__

__import__ 函数可用于导入模块,import 语句也会调用函数。其定义为:

__import__(name[, globals[, locals[, fromlist[, level]]]])

参数介绍:

  • name (required): 被加载 module 的名称

  • globals (optional): 包含全局变量的字典,该选项很少使用,采用默认值 global()

  • locals (optional): 包含局部变量的字典,内部标准实现未用到该变量,采用默认值 - local()

  • fromlist (Optional): 被导入的 submodule 名称

  • level (Optional): 导入路径选项,Python 2 中默认为 -1,表示同时支持 absolute import 和 relative import。Python 3 中默认为 0,表示仅支持 absolute import。如果大于 0,则表示相对导入的父目录的级数,即 1 类似于 '.',2 类似于 '..'。

使用示例如下:

>>> os = __import__('os')>>> os.getcwd()'/home/wangbm'

如果要实现 import xx as yy 的效果,只要修改左值即可

如下示例,等价于 import os as myos

>>> myos = __import__('os')>>> myos.getcwd()'/home/wangbm'

3. 使用 importlib

importlib 是 Python 中的一个标准库,importlib 能提供的功能非常全面。

它的简单示例:

>>> import importlib>>> myos=importlib.import_module("os")>>> myos.getcwd()'/home/wangbm'

如果要实现 import xx as yy效果,可以这样

>>> import importlib>>> >>> myos = importlib.import_module("os")>>> myos.getcwd()'/home/wangbm'

4. 使用 imp

imp 模块提供了一些 import 语句内部实现的接口。例如模块查找(find_module)、模块加载(load_module)等等(模块的导入过程会包含模块查找、加载、缓存等步骤)。可以用该模块来简单实现内建的 __import__ 函数功能:

>>> import imp>>> file, pathname, desc = imp.find_module('os')>>> myos = imp.load_module('sep', file, pathname, desc)>>> myos'sep' from '/usr/lib64/python2.7/os.pyc'>>>> myos.getcwd()'/home/wangbm'

从 python 3 开始,内建的 reload 函数被移到了 imp 模块中。而从 Python 3.4 开始,imp 模块被否决,不再建议使用,其包含的功能被移到了 importlib 模块下。即从 Python 3.4 开始,importlib 模块是之前 imp 模块和 importlib 模块的合集。

5. 使用 execfile

在 Python 2 中有一个 execfile 函数,利用它可以用来执行一个文件。

语法如下:

execfile(filename[, globals[, locals]])

参数有这么几个:

  • filename:文件名。

  • globals:变量作用域,全局命名空间,如果被提供,则必须是一个字典对象。

  • locals:变量作用域,局部命名空间,如果被提供,可以是任何映射对象。

>>> execfile("/usr/lib64/python2.7/os.py")>>> >>> getcwd()'/home/wangbm'

6. 使用 exec

execfile 只能在 Python2 中使用,Python 3.x 里已经删除了这个函数。

但是原理值得借鉴,你可以使用 open … read  读取文件内容,然后再用 exec 去执行模块。

示例如下:

>>> with open("/usr/lib64/python2.7/os.py", "r") as f:...     exec(f.read())... >>> getcwd()'/home/wangbm'

7. import_from_github_com

有一个包叫做 import_from_github_com,从名字上很容易得知,它是一个可以从 github 下载安装并导入的包。为了使用它,你需要做的就是按照如下命令使用pip 先安装它。

$ python3 -m pip install import_from_github_com

这个包使用了PEP 302中新的引入钩子,允许你可以从github上引入包。这个包实际做的就是安装这个包并将它添加到本地。你需要 Python 3.2 或者更高的版本,并且 git 和 pip 都已经安装才能使用这个包。

pip 要保证是较新版本,如果不是请执行如下命令进行升级。

$ python3 -m pip install --upgrade pip

确保环境 ok 后,你就可以在 Python shell 中使用 import_from_github_com

示例如下

>>> from github_com.zzzeek import sqlalchemyCollecting git+https://github.com/zzzeek/sqlalchemyCloning https://github.com/zzzeek/sqlalchemy to /tmp/pip-acfv7t06-buildInstalling collected packages: SQLAlchemyRunning setup.py install for SQLAlchemy ... doneSuccessfully installed SQLAlchemy-1.1.0b1.dev0>>> locals(){'__builtins__': 'builtins' (built-in)>, '__spec__': None,'__package__': None, '__doc__': None, '__name__': '__main__','sqlalchemy': 'sqlalchemy' from '/usr/local/lib/python3.5/site-packages/\sqlalchemy/__init__.py'>,'__loader__': <class '_frozen_importlib.BuiltinImporter'>}>>>

看了 import_from_github_com的源码后,你会注意到它并没有使用importlib。实际上,它的原理就是使用 pip 来安装那些没有安装的包,然后使用Python的__import__()函数来引入新安装的模块。

8. 远程导入模块

我在这篇文章里(深入探讨 Python 的 import 机制:实现远程导入模块),深入剖析了导入模块的内部原理,并在最后手动实现了从远程服务器上读取模块内容,并在本地成功将模块导入的导入器。

具体内容非常的多,你可以点击这个链接进行深入学习。

示例代码如下:

# 新建一个 py 文件(my_importer.py),内容如下import sysimport importlibimport urllib.request as urllib2

class UrlMetaFinder(importlib.abc.MetaPathFinder):    def __init__(self, baseurl):        self._baseurl = baseurl

    def find_module(self, fullname, path=None):        if path is None:            baseurl = self._baseurl        else:            # 不是原定义的url就直接返回不存在            if not path.startswith(self._baseurl):                return None            baseurl = path

        try:            loader = UrlMetaLoader(baseurl)            return loader        except Exception:            return None

class UrlMetaLoader(importlib.abc.SourceLoader):    def __init__(self, baseurl):        self.baseurl = baseurl

    def get_code(self, fullname):        f = urllib2.urlopen(self.get_filename(fullname))        return f.read()

    def get_data(self):        pass

    def get_filename(self, fullname):        return self.baseurl + fullname + '.py'

def install_meta(address):    finder = UrlMetaFinder(address)    sys.meta_path.append(finder)

并且在远程服务器上开启 http 服务(为了方便,我仅在本地进行演示),并且手动编辑一个名为 my_info 的 python 文件,如果后面导入成功会打印 ok

$ mkdir httpserver && cd httpserver$ cat>my_info.pyname='wangbm'print('ok')EOF$ cat my_info.pyname='wangbm'print('ok')$$ python3 -m http.server 12800Serving HTTP on 0.0.0.0 port 12800 (http://0.0.0.0:12800/) ......

一切准备好,验证开始。

>>> from my_importer import install_meta>>> install_meta('http://localhost:12800/') # 往 sys.meta_path 注册 finder>>> import my_info  # 打印ok,说明导入成功ok>>> my_info.name  # 验证可以取得到变量'wangbm'

好了,8 种方法都给大家介绍完毕,对于普通开发者来说,其实只要掌握 import 这种方法足够了,而对于那些想要自己开发框架的人来说,深入学习 __import__ 以及 importlib 是非常有必要的。

另外,强烈给大家推荐的这篇文章:深入探讨 Python 的 import 机制:实现远程导入模块 ,对于你理解Python  import 机制会很有帮助。

推荐阅读

1

Deno 正式发布,Node.js 会被颠覆吗?

2

浅度测评:requests、aiohttp、httpx 我应该用哪一个?

3

200 行代码实现一个滑动验证码

4‍‍

如何用一条命令将网页转成电脑 App

好文和朋友一起看~

import qs from qs 安装_Python 导包难道你只会个 import 吗?相关推荐

  1. Python 导包问题(importerror: attempted relative import with no known parent package)

    Python 导包问题(importerror: attempted relative import with no known parent package) 问题描述 解决方法 问题描述 今天想优 ...

  2. python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)

    python 导入数据包的几种方法 1.直接导入整个数据包:improt 数据包 2.导入数据包中的某一个函数: from 数据包 improt 函数(当函数这一项为 * 时为导入整个数据包) 3. ...

  3. python queue模块安装_Python queue包_程序模块 - PyPI - Python中文网

    沃特?另一个消息队列? 考虑到消息队列的激增,人们可能倾向于相信 发明更多不是答案.使用现有的解决方案是 多次尝试与大多数现有的消息队列产品. 其他的失败(对于我们的用例). queuey是用来处理大 ...

  4. python settings模块安装_Python settings-helper包_程序模块 - PyPI - Python中文网

    在包中设置 在的模块目录中创建默认的/samplesettings.ini文件 您的包,带有一个[default]节和任何其他[sections] 您需要(即应用程序环境)[default] some ...

  5. 已解决import tensorflow.contrib.layers as layers导包错误

    已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'c ...

  6. python os库安装_Python模块/包/库安装(6种方法)

    Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一.方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带s ...

  7. pymysql无法 安装与导包

    在安装pymysql 的时候 我们点击箭头部分输入:pip install pymysql,安装插件的时候,会发生报错 报错信息如下: 此时,把输入内容改为下面内容即可: pip install py ...

  8. python 导包语法 import package as name 和 from package import name 的区别

    今天在导包的时候: # from easydict import EasyDict as edict # 成功 # import easydict.EasyDict as edict # 失败 结果: ...

  9. 关于Java为什么不推荐使用 import *导包这件小事

    文章目录 背景 import * 性能方面 命名冲突 总结 这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发.拒绝营销号,拒绝标题党 背景 最近在给 apache shardi ...

最新文章

  1. 图像处理之目标检测入门总结
  2. C++11并发之std::thread
  3. 使用template.js加载后端数据
  4. 功能表单之评星、进度条、颜色选择器的使用——JEPLUS软件快速开发平台
  5. LeetCode每日一题——只出现一次的数字 III
  6. unity有用资源的导出未package便于在其他工程用的问题解决
  7. opencv:VS无法导入源文件(环境配置不全解决100%有效)
  8. Verilog常用语法
  9. 基于【国基北盛】云基础架构平台软件搭建openstack私有云平台(先电V2.4版本)
  10. Veeam Backup 11 配置信息备份与恢复
  11. php获取视频直链并且跳转,求 cctalk 提取免费视频直链的方法
  12. asp和asp.net有什么区别?
  13. python中得到26个字母
  14. 安裝完成Ubuntu20.04之後要做的事
  15. ping主机时显示 Request Time Out Destination Unreachable TTL Expired in transit
  16. CAS Server
  17. python爬取百度新闻采集教程
  18. 用这个工具,让人抓狂的领导驾驶舱报表五步搞定
  19. [Python] GDAL/OGR操作矢量数据(shp、GeoJSON)
  20. Java15来了!!!一文详解JDK15新特性

热门文章

  1. Javascript中类型的判断
  2. python操作Excel文件
  3. u盘装xp/win7/ubuntu/fedora总结
  4. vue element ui下拉菜单和不是table列表全选功能问题解决方案
  5. javascript设计模式-singleton(单例)模式
  6. JavaScript算法(实例八)递归计算每个月的兔子总数【斐波那契数列】
  7. 「贪心算法」虚拟汽车加油问题
  8. MySQL日期格式符
  9. Linux驱动(14)--字符类设备与驱动
  10. 7-9 包装机 (25 分)