Python 模块化

03-12 4,817 views

     其实在python中,模块、包和库的概念并不是很清晰。如果真要区分它们,可以按照如下几条进行划分:

     1. 一个文件就是一个模块,模块名就是文件名。

     2. 一个目录,包含了__init__.py就是一个包。

     3. 通常的当一个包或者若干包,包含一个setup.py就认为是一个可分发的库。

      

     首先创建一个pypkg包,pypkg中包含两个模块bar和foo。foo 相对引入bar中一个method。最后调用foo。

#pkpkg 目录结构

(py3.4.3) ➜  004 tree pypkg
pypkg
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-34.pyc
│   ├── bar.cpython-34.pyc
│   └── foo.cpython-34.pyc
├── bar.py
└── foo.py

1 directory, 6 files

# bar.py

def main(object):
    print('I Love Python.')


#foo.py

from . import bar

bar.main()


#执行bar 模块

python -m pkpkg.foo

      上面的实例是相对引入一个包里的模块。其实也可以使用绝对引入。

#foo.py

from pypkg import bar

bar.main()

python  -m pypkg.foo

      如上咱们说了一下包的相对引入和绝对引入两种方式。那如何将包发布出去哪? 需要在包的根目录下创建一个setup.py 文件。通过使用distutils或者setuptools库的setup方法,都可以实现。

#setup.py

from distutils.core import setup

setup(
         name='pypkg',   #包的名字
         version='0.1.0',  #版本号
         packages=['pypkg']   #指定要发布包的目录,如果一个包内包含子目录,子目录也要添加到该packaes内,否则无法发布子目录。
        install_requires=['request', 'urllib2']   #指定该库依赖的其它软件包.
)

      这样的话,一个简单的setup.py 配置文件就搞定了。这样写是不是感觉packages 每次还得指定build的内容呀,感觉特别的费劲。如果哪次忘记了一个目录,可能这个库的包还不完整。其实还有一种方法,可以实现自动查找该库内的所有包,并将包加入到库里。

#setup.py


from setuptools import setup, find_packages

setup(
        name='pypkg', 
        version='0.1.0',
        packages=find_packages(),
        install_requires=['requests', 'urllib2 == 0.0.1']
)

      软件包编译及安装:

#python 编译
python setup.py  build  

#python 安装该软件包
python setup.py install  

      在python下还有一个第三方库pip,我想大家应该回比较喜欢它。它对软件包管理起来会更加简单及效率。

# 安装软件包
pip install .    #安装当前软件包
pip install   git+https://github.com/software/apps   #从github上安装
pip install   + software   #默认从python 官方的pypi上进行安装
pip install -i  + pypi repo + software  #指定pypi repo 进行安装


pip freeze  #输出当前的所有安装的软件包
pip freeze > requirements.txt   #可以将所有依赖的软件包输出到指定文件
pip  install -r requirements.txt   #在安装软件包之前,先将所有的依赖包进行安装.

      如果你感觉你的代码写的还可以,可以将你的代码push到python官方pypi仓库。