包括 1.不能从之前导入的包、模块作为基础进行二次倒入
>>>from xmlrpc import client
>>>from client import ServerProxy
ImportError: No module named 'client'
>>>from xmlrpc.client import ServerProxy
2.不能以alias作为模块名进行导入
>>>import xmlrpc.server as server
>>>from server import SimpleXMLRPCServer
ImportError: No module named 'server'
>>>from xmlrpc.server import SimpleXMLRPCServer
1.事实上不在所谓的if __name__ == "__main__":
中的语句都会被执行
但要注意,由于命名空间的原因,导入的模块中的变量的赋值是没有意义的
2.如果导入包,则还会执行__init__.py
中的定义以及语句
参考
http://dangzhiqiang.blog.51cto.com/7961271/1535904
简单来说就是不要学java式导入,在方法体内导入,就可以避免
从python3开始,不再将当前包内的路径作为默认的搜索路径之一。
所以导入包内模块(在不设置搜索路径的前提下)需要使用 .
from .mymodule import * #导入包内模块的内容
from . import mymodule #导入包内模块
需要注意的是相对导入仅适用于纯模块文件,不能作为顶层文件导入,当同时需要作为顶层文件运行时
需要直接导入模块名。
from mymodule import *
所以当一个文件既有可能成为一个模块被导入,有可能作为顶层文件直接运行,则导入包内模块时需要
同时考虑两方面情况
:
if __name__ == '__main__':
from textConfig import ( # run as TopLevel
opensAskUser, opensEncoding,
savesUseKnownEncoding, savesAskUser, savesEncoding)
else:
from .textConfig import ( # run as a module
opensAskUser, opensEncoding,
savesUseKnownEncoding, savesAskUser, savesEncoding)
reference>http://stackoverflow.com/questions/16981921/relative-imports-in-python-3
搜索路径有一个源定义,两阶拓展:
源定义:PYTHONPATH
一阶拓展:PYTHONPATH下任何拓展名为.pth的文件
二阶拓展:在二者搜索路径下通过点号进行导入
默认搜索路径可以通过sys.path查看
因此可以动态设置搜索路径:
import sys
sys.path.append('..') #将文件的上一级目录设为搜索路径
pass