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__': <module 'builtins' (built-in)>, '__spec__': None,'__package__': None, '__doc__': None, '__name__': '__main__','sqlalchemy': <module '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__函数来引入新安装的模块 。
远程导入模块我在这篇文章里(深入探讨 Python 的 import 机制:实现远程导入模块),深入剖析了导入模块的内部原理,并在最后手动实现了从远程服务器上读取模块内容,并在本地成功将模块导入的导入器 。
具体内容非常的多,你可以点击这个链接进行深入学习 。
示例代码如下:
# 新建一个 py 文件(my_importer.py),内容如下import sysimport importlibimport urllib.request as urllib2class UrlMetaFinder(importlib.abc.MetaPathFinder):def __init__(self, baseurl):self._baseurl = baseurldef find_module(self, fullname, path=None):if path is None:baseurl = self._baseurlelse:# 不是原定义的url就直接返回不存在if not path.startswith(self._baseurl):return Nonebaseurl = pathtry:loader = UrlMetaLoader(baseurl)return loaderexcept Exception:return Noneclass UrlMetaLoader(importlib.abc.SourceLoader):def __init__(self, baseurl):self.baseurl = baseurldef get_code(self, fullname):f = urllib2.urlopen(self.get_filename(fullname))return f.readdef get_data(self):passdef 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.py<EOFname='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自动化 页面加载速度太慢,如何提升测试效率?
- 5个有趣的Python库
- 淘宝店铺分销怎么操作 现在淘宝怎么做分销
- 淘宝直通车图和主图的区别 淘宝直通车测图操作步骤
- 360安全路由5G 通过多终端查看USB存储设备的操作方法
- Python中的多处理与多线程:新手简介
- 别在Python中使用“+”来连接字符串了,还有更好用的方法
- 常用Linux发行版操作系统大盘点
- 十一种光纤网络通讯传输方案
- 开网店第一步怎么操作 网上开店的基本流程要点
