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
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了