为什么要替换import
- 首先,Python导入上级目录的模块是个很麻烦的事,一般要修改sys.path
- 其次,Python导入子目录的模块必须添加
__init__.py
文件,虽然很简单,但是有必要吗,要吗,吗。。。 - 习惯了web开发的人对相对路径导入都很熟悉,特别是nodejs实用
require
方法导入很方便,所以我也写了一个类似的Pythonrequire
方法,可以模仿nodejs的require
方法。
怎么实现的
其实实现的方法还是比较简单的,Python内置了一个模块导入方法__import__
,但是它并不能按文件名来导入,而是按照类似import
语法的方法来导入,比如__import__('a/b')
会报一个错误:
>>> __import__('a/b')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: Import by filename is not supported.
但是__import__
对于同级目录的模块导入是没有问题的。
所以我的工作就是对工作路径的处理。具体步骤就是:
1. 保存当前工作路径
2. 获取目标模块的上级目录,并且切换当前目录到该目录
3. 导入模块
4. 切换回原来的工作目录
注意
导入模块的时候要修改sys.path,加入当前目录,不然importer会按以前的导入优先级导入
大家有兴趣可以去github上看看,欢迎批评指正,请移步https://github.com/xupingmao/require.py
使用方法
具体使用方法类似于nodejs,有两点需要注意
1. 启动文件中必须from require import *
或者import require
,其他文件中就可以直接使用了。
2. 导入时不用写文件后缀,比如require('lib/modA')
这样就可以了。
3. 实现from modA import *
功能的写法require('modA', globals())