设为首页 收藏本站
查看: 683|回复: 0

[经验分享] python module management(模块管理)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-8-4 09:08:56 | 显示全部楼层 |阅读模式
python模块
     就是python的程序模块
     顶层文件
     模块文件1
     模块文件2   
     可以将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块。模块在物理形式上表现为以.py结尾的代码文件。一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件。模块的文件名就是模块的名字加上扩展名.py。每个模块都有自己的名称空间。
     python允许“导入”其它模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统。python中,模块也是对象;在一个模块顶层定义的所有变量都在被导入时成为了被导入模块的属性。
   
python的程序架构
     一个python程序通常包括一个顶层程序文件和其它的模块文件(0个、1个或多个)
     顶层文件:包含了程序的主要控制流程
     模块文件:为顶层文件或其它模块提供各种功能性组件。模块首次导入(或重载)时,python会立即执行模块文件的顶层程序代码(不在函数内的代码),而位于函数主体内的代码直到函数被调用后才会执行。python也自带了很多模块,可以使用help(module)查看,这些被称为python标准库文件
   
模块的执行环境
     模块是被导入的(import),但模块也可以导入和使用其它模块,这些模块可以用python或其它编程语言写成。
     模块可内含变量、函数以及类来进行其工作,而函数和类可以包含变量和其它元素。
     建议:在顶层文件可以出现大量的控制流语句,而其它的被调用文件仅包含变量、函数及类,这样程序在执行时效率才会高。

python导入模块 
     在导入模块时只能使用模块名,而不能使用带.py后缀的模块文件名
     import语句:导入指定的整个模块,包括生成一个以模块名命名的名称空间
     import module1[, module2[, ... moduleN ]]       建议一个import语句只导入一个模块
     import module as module_alias
     from-import语句: 常用于只导入指定模拟的部分属性至当前名称空间
     from module import name1[, name2[, ... nameN ]]   
         例:from random import choice,randint,random
     建议:在顶层文件可以出现大量的控制流语句,而其它的被调用文件仅包含变量、函数及类,这样程序在执行时效率才会高。

     import 和 from - import是赋值语句
     import和from 是可执行语句,类似于def,因此,它们可以嵌套在if测试中,出现于def中等等
     python执行到这些语句时才会对其进行解析,这意味着,所有来自模块的属性仅在import语句执行后才能使用。
     import 和from 都是隐性赋值语句
     import 将整个模块对象赋值给一个变量名;from将一个或多个变量名赋值给导入此模块的模块中的同名对象
     模块就是名称空间:模块的名称空间可以通过属性__dict__或dir(M)获取;模块属性可通过点号(.)运算符获取,格式为M.attr;模块是一个独立的作用域(本地变量就是全局变量)

     import的工作机制
     import语句导入指定的模块时会执行三个步骤:
        (1) 找到模块文件:在指定的路径下搜索模块文件
        (2) 编译成字节码:文件导入时就会编译,因此顶层文件的.pyc字节码文件在内部使用后会被丢弃,只有被导入的文件才会留下.pyc文件。
        (3) 执行模块的代码来创建其所有定义的对象:模块文件中的所有语句会依次执行,从头至尾,而此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性。
     注意:模块只在第一次导入时才会执行如上步骤。后续的导入操作只不过是提取内存中已加载的模块对象。reload可用于重新加载模块。

     模块搜索:
     python解释器在import模块时必须先找到对应的模块文件
     程序的主目录;PYTHONPATH目录(如果设置了些变量);标准链接库目录;任何.pth文件的内容(如果存在.pth文件)
     这四个组件组合起来即为sys.path所包含的路径,而python会选择"在搜索路径中的第一个符合导入文件名"的文件。
        import sys
        sys.path    返回一个路径列表,该路径列表是python解释器需要搜索的路径顺序列表
        
        例:
        mkdir /tmp/python27/lib
        vim /tmp/python27/lib/mymod.py
        #!/usr/local/python27/bin/python27
        #
        x = 30        
        def printInfo():
            print x + 30        
        class MyClass():
            data = 'hello myclass'
            def __init__(self,who):
                self.name = who
            def printName(self):
                print self.data,self.data               
        
        import mymod        在python中导入mymod模块时,提供找不到该模块文件,系统报错
        sys.path.append('/tmp/python27/lib')    修改sys.path的值,追加指定位置
        print sys.path              确认sys.path是否追加成功
        import mymod        再次导入mymod模块,导入成功
        mymod.x                 执行模块的x属性
        mymod.printInfo()     执行模拟的函数
        inst1 = mymod.MyClass('tom')        将模块中的类实例化成对象
        inst1.data          返回inst1实例的data属性
        inst1.name          返回inst1实例的name属性
        inst1.printName()      执行inst1实例的printName()方法(即函数)
        mymod.__name__      返回mymod模块的名称
        
        vim /tmp/python27/lib/mymod.py
            if __name__ = '__main__':
                printInfo()
                inst2 = MyClass('jerry')
                print inst2.data
                print inst2.name            
     如果有多个模块,而且这些模块又有关联性,不能单独使用,此时就需要使用包。
   
Python包
     包用于将一组模块归并到一个目录中,此目录即为包,目录名即为包名。包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的python应用程序执行环境。基于包,python在执行模块导入时可以指定模块的导入路径。
     import dir1.dir2.mod1
     python包可以非常便捷的将我们能够把一类具有特定关联性的模块放在一起来生成一个功能 更强大的,能够自我组织的目录结构,这就叫做包。            
     要使用如下图所示的package1,则py_pkg_mod容器必须要在模块搜索路径中。导入时可以执行:import package1.mod1 即可
     包导入语句的路径内的每个目录内都必须有__init__.py文件。__init__.py可包含python代码,但通常为空,仅用于扮演包初始化的挂钩、替目录产生模块命名空间以及使用目录导入时实现from * 行为的角色。
                     →    package1    →    __init__.py
                                         →    mod1.py
         py_pkg_mod    →    package2    →    __init__.py
                                         →    mod2.py
                     →    mod3.py
   
        例:
            mkdir /tmp/python27/lib/pkg1
            touch /tmp/python27/lib/pkg1/__init__.py
            cp /tmp/python27/lib/{mymod,pkg1/yanmod}
            import pkg1.yanmod
            pkg1.yanmod.x  

     模块的顶层执行及被导入
     一个模块文件可以同时支持顶层执行(作为顶层文件)或被导入(作为模块文件)
     每个模块都有一个名为__name__的内置属性,python会自动设置该属性。如果文件是以顶层程序文件执行,在启动时,__name__的值为"__main__"。如果是被导入,则__name__的值为模块名。
     通过在模块文件中检测自己的__name__属性,可以实现在执行时运行指定的代码。常用于模块的自我测试:
            #!/usr/bin/python
            #
            def testFunc():
                print "Hello, there ..."
            if __name__ == "__main__":
                testFunc()

发布python模块或程序
    python模块、扩展和应用程序可以按以下几种形式进行打包和发布
     压缩文件(使用distutils): windows的zip文件和类Unix平台的.tar.gz文件
     自动解包或自动安装可执行文件: windows中的.exe   
     自包含的,不要求安装的预备运行可执行程序:windows的.exe文件、unix上带有一个小的脚本前缀的IP压缩文件、Mac上的.app文件等。
     平台相关的安装程序:windows上的*.msi文件、Linux上常见的.rpm、src.rpm和.deb文件等
     python eggs:较流行的第三方扩展

    使用distutils发布模块
     distutils模块能够帮助完成模块或程序发布。“发布”是指一个文件集合,这些文件联合在一起可以使用distutils构建、打包和发布模块;创建好的发布可以用于安装、也可以上传到PyPI与他人共享。
     创建布发:(1)将各代码文件组织到模块容器中;(2)准备一个README或README.txt文件;(3)而后在容器中创建setup.py文件
        例:
            from distutils.core import setup
            setup(
                name    = 'testmod',    #此为包名
                version = '0.0.1',
                author  = 'me',
                author_email    = 'cyj@163.com',
                py_modules  = ['testmod'],      #此为所有模块名的列表
                url     =   'http://www.xxx.com',
                description =   'A simple module',
                )
                属性说明:
                name    包的名称
                author  作者名
                Version 版本号
                author_email    作者的电子邮箱
                maintainer  维护者的名称
                maintainer_emain    维护者的电子邮箱
                url 包的主页
                description 包的描述信息
                long_description    包的详细描述
                download_url        包的下载地址
                Classifiers     字符串分器列表
                platform        平台列表
                license         许可证
                py_modules  各模块名称组成的列表,这些模块可能位于包的根目录下(modname),也可能位于某个子包目录中(subpkg1.modname)。
                packages    各子包名称的列表
            以上大体可以分为两类:元数据信息和包中的内容列表。
     完成打包:在要发布的容器目录中执行“python setup.py sdist”命令就可以生成包了。包的使用就像ipython的使用一样:python setup.py build && python setup.py  install

        python setup.py  sdist 可以指定格式打包。要以指定格式打包可以加  --formats=...  参数
            zip:  zip file
            gztar: tar.gz file
            bztar: tar.bz2 file
            ztar: tar.Z file
            tar: tar file

        python setup.py bdist       要以bdist指定的格式有:
            gztar: tar.gz file
            ztar: tar.Z file
            tar: tar file
            zip: zip file
            rpm:  RPM Package
            pkgtool: Solaris pkgtool
            wininst: windows上自解压的zip格式包
            msi: Microsoft Installer

        以下专用命令不用为bdist指定参数
            bdist_dump:
            bdist_rpm:
            bdist_wininst:
            bdist_msi:

        获取帮助的方式:
            python setup.py --help
            python setup.py --help-command  所有可以使用的命令
            python setup.py COMMAND --help 获取特定命令的帮助
            python setup.py COMMAND --help-formats 获取特定命令支持的格式
               
            python setup.py bdist  --formats=rpm
            python setup.py bdist  --help
            pip , ease_install

        python安装包:
            python setup.py build <build之后会在当差目录下生成一个build目录>
            python setup.py install <该步骤可以直接触发build步骤>
           
        python setup.py build 时可以加一些参数:
            --build-base=/path/to/build_dir
         编译之后在build目录中会生成一个lib和lib.platform目录,它们存储即将安装的模块文件,其中lib目录存储纯python语言编写的模块文件,而lib.platform存储一些跟平台相关的模块文件。
         第三方模块的默认安装路径通常为:site-packages
         print sys.path可以查看到以上路径。

           自定义安装路径:
                --user=
                --prefix=
                --exec-prefix=

           深度定制:
                --install-purelib=/path/to/python_lib
                --install-platlib=/path/to/plat_lib
                --install-lib=/path/to/lib
                --install-scripts=/path/to/bin 可执行文件的安装路径。
                --install-data=
                --install-headers=

例:
    [iyunv@master pkg1]# pwd
    /tmp/python/lib/packages/pkg1
    [iyunv@master pkg1]# ls
    __init__.py  __init__.pyc  mod1.py  mod1.pyc  README  setup.py
    [iyunv@master pkg1]# cat setup.py
    #!/usr/bin/python
    #
    from distutils.core import setup
    setup(
            name        = 'mod1',
            version        = '1.0',
            author        = 'cyj',
            author_email = 'cyj@163.com',
            py_modules        = ['mod1'],
            url                = 'http://www.test.com',
            download_url= 'http://www.test.com/download',
            description        = 'test module',
    )
    [iyunv@master pkg1]# python setup.py sdist
    running sdist
    running check
    warning: sdist: manifest template 'MANIFEST.in' does not exist (using default file list)
    writing manifest file 'MANIFEST'
    creating mod1-1.0
    making hard links in mod1-1.0...
    hard linking README -> mod1-1.0
    hard linking mod1.py -> mod1-1.0
    hard linking setup.py -> mod1-1.0
    creating dist
    Creating tar archive
    removing 'mod1-1.0' (and everything under it)
    [iyunv@master pkg1]# ls
    dist  __init__.py  __init__.pyc  MANIFEST  mod1.py  mod1.pyc  README  setup.py
    [iyunv@master pkg1]# ls dist/
    mod1-1.0.tar.gz
    [iyunv@master pkg1]#
    [iyunv@master pkg1]# python setup.py bdist
    running bdist
    running bdist_dumb
    running build
    running build_py
    creating build
    creating build/lib
    copying mod1.py -> build/lib
    installing to build/bdist.linux-x86_64/dumb
    running install
    running install_lib
    creating build/bdist.linux-x86_64
    creating build/bdist.linux-x86_64/dumb
    creating build/bdist.linux-x86_64/dumb/usr
    creating build/bdist.linux-x86_64/dumb/usr/local
    creating build/bdist.linux-x86_64/dumb/usr/local/python27
    creating build/bdist.linux-x86_64/dumb/usr/local/python27/lib
    creating build/bdist.linux-x86_64/dumb/usr/local/python27/lib/python2.7
    creating build/bdist.linux-x86_64/dumb/usr/local/python27/lib/python2.7/site-packages
    copying build/lib/mod1.py -> build/bdist.linux-x86_64/dumb/usr/local/python27/lib/python2.7/site-packages
    byte-compiling build/bdist.linux-x86_64/dumb/usr/local/python27/lib/python2.7/site-packages/mod1.py to mod1.pyc
    running install_egg_info
    Writing build/bdist.linux-x86_64/dumb/usr/local/python27/lib/python2.7/site-packages/mod1-1.0-py2.7.egg-info
    Creating tar archive
    removing 'build/bdist.linux-x86_64/dumb' (and everything under it)
    [iyunv@master pkg1]# ls
    build  dist  __init__.py  __init__.pyc  MANIFEST  mod1.py  mod1.pyc  README  setup.py
    [iyunv@master pkg1]# ls dist/
    mod1-1.0.linux-x86_64.tar.gz  mod1-1.0.tar.gz
    [iyunv@master pkg1]#
    [iyunv@master pkg1]# ls build/
    bdist.linux-x86_64  lib
    [iyunv@master pkg1]# ls build/lib/
    mod1.py
    [iyunv@master pkg1]# ls build/bdist.linux-x86_64/
    [iyunv@master pkg1]#
    [iyunv@master pkg1]# python setup.py bdist --format=rpm
    [iyunv@master pkg1]# ls
    build  dist  __init__.py  __init__.pyc  MANIFEST  mod1.py  mod1.pyc  README  setup.py
    [iyunv@master pkg1]# ls dist/
    mod1-1.0-1.noarch.rpm  mod1-1.0-1.src.rpm  mod1-1.0.linux-x86_64.tar.gz  mod1-1.0.tar.gz
    [iyunv@master pkg1]#

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-252535-1-1.html 上篇帖子: python Exception(异常处理) 下篇帖子: python os模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表