美文网首页
Python的模块

Python的模块

作者: 上发条的树 | 来源:发表于2016-05-30 14:05 被阅读52次

    模块的使用

    >>> import math
    >>> math.pow(2,3)
    8.0
    

    math就是一个模块,import引入这个模块,使用了模块中pow()这个函数。模块的好处就是:拿来就用,不用自己重写。

    >>> dir(math)
    ['__doc__', '__file__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
    >>> math.pi
    3.141592653589793
    

    通过dir(),可以发现math模块中有以上这些函数。

    说到底,模块也是像我们之前写过的后缀为.py的文件,因此我们可以自己定义模块。
    例如:
    在~/documents的路径下创建了文件:mymodule.py
    文件内容如下:

    #!/usr/bin/env Python
    # coding=utf-8
    
    name = "Python"
    

    先告诉解释器,我自定义的模块放在哪里:

    >>> import sys
    >>> sys.path.append("~/documents/mymodule.py")
    

    接着,使用import引入这个模块,并使用里面的变量。

    >>> import mymodule
    >>> mymodule.name
    'Python'
    

    解释器如何判断.py文件为程序执行还是作为模块引入

    mymodule.py文件修改如下:

    #!/usr/bin/env Python
    # coding=utf-8
    
    def name():
        return "Python"
    
    if __name__ == '__main__':
        print name()
    

    作为程序执行时:

    $ python mymodule.py
    Python
    

    作为模块导入时:

    >>> import sys
    >>> sys.path.append("~/documents/mymodule.py")
    >>> import mymodule
    >>> mymodule.name()
    'Python'
    

    此时,mymodule.py中的函数name()就是一个属性:

    >>> dir(mymodule)
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'name']
    

    同一个.py文件,可以作为程序直接运行,也可以作为模块导入

    >>> __name__
    '__main__'
    >>> mymodule.__name__
    'mymodule'
    

    如果要作为程序执行,那么__name__ == '__main__'
    如果作为模块导入,即变量__name__的值是模块名称。
    用这种方式,便可区分是执行程序还是模块引入。
    一帮情况下,如果是作为模块导入,可以不写:
    if __name__ == '__main__'

    模块的位置

    上面提到,为了使得我们自己写的模块能够被Python解释器知道,需要这样:sys.path.append("~/documents/mymodule.py")。其实,在Python中,所有模块都被加入到sys.path里面了。用如下的方式可以看到模块所在位置:

    >>> import sys
    >>> import pprint 
    >>> pprint.pprint(sys.path)
    ['',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
     '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
     '/Library/Python/2.7/site-packages',
     '~/documents/mymodule.py']
    

    从中也可看到我们自己写的模块的位置。凡是在上面列表中所包括的位置内的.py文件都可以作为模板引入。

    因此,复制文件mymodule.py到 '/Library/Python/2.7/site-packages'的位置下,改名为mymodule2.py:

    $ sudo cp mymodule.py /Library/Python/2.7/site-packages/mymodule2.py
    Password:
    $ ls /Library/Python/2.7/site-packages/mymodule2.py
    /Library/Python/2.7/site-packages/mymodule2.py
    

    然后就可以直接导入了,而不需要再写路径:

    >>> import mymodule2
    >>> mymodule2.name
    <function name at 0x1046d1c08>
    >>> mymodule2.name()
    'Python'
    

    也就是,要将模块文件放到合适的位置——就是 sys.path 包括位置——就能够直接用 import 引入了。

    相关文章

      网友评论

          本文标题:Python的模块

          本文链接:https://www.haomeiwen.com/subject/dsjxdttx.html