python (模块、包)搜索与导入的问题

1.关于导入

1.1不能迭代导入

包括 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

2.导入模块时执行的语句

1.事实上不在所谓的if __name__ == "__main__":中的语句都会被执行
但要注意,由于命名空间的原因,导入的模块中的变量的赋值是没有意义的

2.如果导入包,则还会执行__init__.py中的定义以及语句

3.关于模块交叉引用的问题

参考

http://dangzhiqiang.blog.51cto.com/7961271/1535904

简单来说就是不要学java式导入,在方法体内导入,就可以避免

4.相对导入

从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

5.关于搜索路径

搜索路径有一个源定义,两阶拓展:

源定义:PYTHONPATH 
一阶拓展:PYTHONPATH下任何拓展名为.pth的文件
二阶拓展:在二者搜索路径下通过点号进行导入

默认搜索路径可以通过sys.path查看

因此可以动态设置搜索路径:

import sys
sys.path.append('..') #将文件的上一级目录设为搜索路径

6.设置__all__限制从包里导出的模块

pass

你可能感兴趣的:(Python)