浅谈setuptools之namespace package概念
本文的撰写动因:最近在折腾zope WEB 框架,在研究依赖包安装的过程中偶然发现了setup.py中的namespace package这个概念,发现自己竟是一头雾水,百度了一遍发现并没有中文的详细讲解文章,自己平日里看其它大神的文章受益匪浅,而自己从未对他人做出过什么贡献,遂开通了一个CSDN博客,试着把这个问题说明白。
note 1:本文读者应具备python package、module以及python程序打包的的基本知识
note 2:若有任何错误请指出或叙述不轻的地方,请吐槽-_-,本人将第一时间更正
note 3:本文以python2.7为例,如果有读者使用的版本不同,有些目录名称可能不同
1.PYTHON的package查找模式
与java类似,PYTHON中也有package的概念,所谓package,就是包含一个或多个python module、package的集合,在系统中以文件夹的形式存在,每个package文件夹中还需要包含一个__init__.py
文件(若有子package,则每个子package目录中也要包含一个__init__.py
文件)
例如我们定义一个名为a的package:
[root@localhost ~]# cd ~/test mkdir && package_test
[root@localhost package_test]# mkdir a
[root@localhost package_test]# echo > a/__init__.py
[root@localhost package_test]# echo 'print "module_1"' > a/module_1
为了演示方便,我们的工作目录可以通过pwd
命令查看:
[root@localhost package_test]# pwd
/root/test/package_test
由于python自动将工作目录加入到sys.path中(对sys.path陌生的请自行百度),
执行python
命令,测试package a
中的module_1
可以正常导入
[root@localhost package_test] python
>>> import a.module_1
>>> module_1
可以看到,package a
中的moduel_1正常import了
至此,一切都按照我们的设想正常进行
接下来,玩坏了!
现在假设某位大神dashen想与我们合作,但又不想和我们共用一个目录,因而他提出让我们给他开一个帐号,名称为dashen,而他自己的代码就保存在/home/dashen 目录(家目录)下
于是,dashen兄做了以下操作:
[dashen@localhost ~]$ mkdir my_project && cd my_project
胃疼的是:由于dashen兄所负责的功能与我们package a
中的很相似,因此他也将自己的代码放到了package a
中:
[dashen@localhost my_project]$ mkdir a
[dashen@localhost my_project]$ echo 'print "moduel_2"' > a/module_2.py
这个时候,我们要对代码进行联调,所以将dashen兄的项目目录加入了sys.path中:
[root@localhost package_test]# python
>>> import sys<