1. python中的模块
python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包。 只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用。
上面这段描述最重要的两个点:
- py文件是一个模块
- 导入的模块必须在sys.path中
- __init__.py 文件中会写入包的一些信息,包括导入是应该导入哪些模块等等
2. 导入本目录下的模块(同一目录)
对于同一目录下的两个文件a.py和b.py。
a.py:
def a_print() :
print(" I am a ")
如果要想在b.py中用a模块中的a_print()函数,则一般我们直接写成:
from a import a_print
....
a_print()
....
事实上,我也一直这么用。
但是这种用法有一个问题,需要就是b.py文件本身run。换句话说,如果有不在同一目录下的文件main.py通过导入b模块来引用a模块中的函数,是不可行的。b.py中必须写成:
from .a import a_print
加上【.】的意思就是相对路径导入。关于这一点,stackoverflow中有个问题下举例解释的非常清楚,我就不再搬运了,传送门
(http://stackoverflow.com/questions/16981921/relative-imports-in-python-3)
3. 导入子目录下的模块
虽然题目是子目录,其实说白了就是不同目录下的其他模块,也就是py文件。根据前面所述,这条路径必须是在sys路径。
因为很简单,python import就是在sys目录中查找模块并导入。
此处还需注意,如果我们直接这样写:
sys.path.append('./subdir') # 此处使用相对路径
那么就会出现上述第二条的那种情况,因为对于执行不同的脚本文件,相对路径是不一样的,也就是说在其他目录中导入这个文件时,子目录下模块的相对路径就不是”./”了。
通常如下处理:
current_path = os.path.dirname(__file__)
module_path = os.path.join(current_path, 'subdir')
sys.path.append(module_path) # 导入的绝对路径
mod = __import__('modules', globals(), locals())
然后就是正常的导入了(不用加路径,直接import 模块名字)