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仓库。