Python的package安装到哪里了?
package放到哪里去了? 怎么好像乱七八糟的?
打开site-packages目录, 里面是各种安装好的包. 但是目录名格式各异. 这是怎么回事?
经过观察, 有这么四种:
1.
site-packages/pylab.py
这种是最好理解的, 因为单个.py文件就可以作为module被引用. 虽然丑了点, 但是单独扔在site-packages下也没问题.
2.
site-packages/toolz
site-packages/toolz-0.8.0-py2.7.egg-info
这种包, 有两个目录, 一个目录以包名命名, 因为含有__init__.py的目录, 可以作为module被引用.
另一个egg-info目录是一些metadata, 没什么大用, 有些包也没有这个目录.3.
site-packages/fasttext-0.7.6-py2.7-linux-x86_64.egg
单独一个.egg文件. 这种包, 是把模块都打进了一个egg压缩包里. 这个压缩包可以视为一个目录, 模块文件在这里:
site-packages/fasttext-0.7.6-py2.7-linux-x86_64.egg/fasttext
4.
site-packages/titlectr-0.1-py2.7.egg
虽然文件名跟3相同, 但是这是一个目录, 可以视为是3解压后的样子. 模块文件在这个目录里:
site-packages/titlectr
我们知道, site-packages是在模块搜索的path(sys.path)里的, 所以1和2这两种存放包的方式, 可以直接被搜索到, 可以直接import, 但是3和4这两种方式, 包是在子目录中, 所以无法直接import. 于是安装的时候, 安装工具会将.egg目录加入到path中(.pth文件). 比如将site-packages/fasttext-0.7.6-py2.7-linux-x86_64.egg
和site-packages/titlectr-0.1-py2.7.egg
写入到site-packages/easy_install.pth
中. 也可以写在其他的site-packages/*.pth
中, 比如给每个package单独建一个.pth文件.
python有两个setup工具, 一个是setuptools(from setuptools import setup
), 另一个是distutil(from distutil import setup
).
- setuptools安装的包, 会形如3和4的样子. 这个工具有完善的打egg包的功能, 也倾向于把模块的功能部分和metadata打成一个整体(egg), 方便管理. 使用
python setup.py bdist_egg
命令, 可以将module打成egg包, 方便部署. - distutil. 我们在使用的时候发现, distutil不会在打包上做首选尝试. 如果不需要复杂的编译操作, distutil会直接把源码包复制到site-pacakages下(参见2), 并创建一个和模块并列的metadata. 如果package中有个大文件比如字典(当然很不推荐将大字典封装作为package的一部分, 一般外挂), 使用setuptools, 会耗费极大的时间在打包egg上, 而distutil可以直接拷贝安装.
- 除此之外, wheel是一种新的格式. 更类似于java的jar包.
python setup.py bdist_wheel
可以打包成wheel包. 更多打包信息可以参考这里
参考文献
packaging python