python包导入的问题

jakic 发布于 2015/09/07 19:21
阅读 379
收藏 0
平时用到os.path.join()这个函数时,只要在文件头那import os就行了,而不是import os.path,那为啥自定义的包时又不能这样呢?比如pkg1包下面有个pkg2的包,pkg2下面有个模块module1,在其他模块中使用module1时,就要import pkg1.pkg2.module1来完整导入,而不能只是import pkg1,这是为什么?

加载中
0
A
AQ5088

python自带的标准库里并没有所谓的path.py模块,path操作与具体的操作系统息息相关,你在python的目录下能看到这么几个模块:riscospath.py、ntpath.py、macpath.py、posixpath.py等等

看os.py里的代码大致就应该能明白了,import os的时候,会根据系统平台加载对应版本的xxxpath.py模块,比如windows下就是ntpath.py,并且通过sys.modules['os.path'] = path语句把path模块添加到python的已加载模块列表中

关于sys.modules请参考http://www.cnblogs.com/tuzkee/p/3540448.html

#代码片段,删除了部分代码
if 'posix' in _names:
    import posixpath as path
elif 'nt' in _names:
    import ntpath as path
elif 'os2' in _names:
    import os2emxpath as path
    from _emx_link import link
elif 'ce' in _names:
    import ntpath as path
elif 'riscos' in _names:
    import riscospath as path

sys.modules['os.path'] = path




0
雪梨苹果
雪梨苹果

那是因为导入规则是按py文件的__name__为标准。

除了py默认的导入路径,还有dist-packages(site-packages)中pth文件中设置的路径,最后还有__name__为'__main__'的路径。

即是说你运行的py文件(__main__)同级或者子级的包(模块)都能导入或者相互导入(绝对导入和相对导入)。超出__main__范围的你要设置path。

0
PynixWang
PynixWang

python是把名字倒入当前名字空间,你导入pkg2你就的从pkg2开始引用。类似pkg2.pkg1.module这样的,要短一点就from pkg2 import pkg1.module 或者  from pkg2.pkg1 import module

0
alvy
alvy
import *和from * import *
前者相当于导入一本书
后者相当于导入一本书中的一页

例子:

import types
if type(num) is types.IntType:
    pass



from types import IntType
if type(num) is IntType:
    pass





前者需要加上模块名。后者性能更优,减少了从库中查询的次数…

返回顶部
顶部