让我们尝试创建最简单的python3.6名称空间模块 并使用setuptools进行安装。
$ ls -R .
.:
ns setup.py test
./ns:
mod.py
./test:
test.py
$ cat setup.py
from setuptools import setup
setup(
name='ns_test',
namespace_packages=['ns'],
py_modules=['ns.mod'],
zip_safe=True
)
$ cat test/test.py
import ns.mod
文件ns / mod.py可能包含任何有效代码,也可能为空。
现在让我们安装它:
$ python3.6 setup.py install --prefix=~/.local
结果看起来不错:
$ls ~/.local/lib/python3.6/site-packages/
easy-install.pth ns_test-0.0.0-py3.6.egg
$ unzip -l unzip -l ~/.local/lib/python3.6/site-packages/ns_test-0.0.0-py3.6.egg
Archive: /home/lel/.local/lib/python3.6/site-packages/ns_test-0.0.0-py3.6.egg
Length Date Time Name
--------- ---------- ----- ----
181 2018-12-10 20:32 EGG-INFO/PKG-INFO
221 2018-12-10 20:32 EGG-INFO/SOURCES.txt
1 2018-12-10 20:32 EGG-INFO/dependency_links.txt
3 2018-12-10 20:32 EGG-INFO/namespace_packages.txt
3 2018-12-10 20:32 EGG-INFO/top_level.txt
1 2018-12-10 20:32 EGG-INFO/zip-safe
0 2018-12-10 19:44 ns/mod.py
121 2018-12-10 20:32 ns/__pycache__/mod.cpython-36.pyc
--------- -------
531 8 files
$ cat ~/.local/lib/python3.6/site-packages/easy-install.pth
./ns_test-0.0.0-py3.6.egg
但是没有任何效果:
$ python3.6 test/test.py
Traceback (most recent call last):
File "test/test.py", line 1, in <module>
import ns.mod
ModuleNotFoundError: No module named 'ns'
但是很容易纠正。让我们将.egg
的末端包装拆开:
$ mkdir tmp
$ cd tmp
$ unzip ~/.local/lib/python3.6/site-packages/ns_test-0.0.0-py3.6.egg
$ zip -r ~/.local/lib/python3.6/site-packages/ns_test-0.0.0-py3.6.egg ns EGG-INFO
$ cd ..
现在神秘地测试工作!可以导入其中的名称空间包和模块!
但是有什么区别?让我们再次看看.egg
:
$ unzip -l unzip -l ~/.local/lib/python3.6/site-packages/ns_test-0.0.0-py3.6.egg
您看到区别了吗?就是这三行
0 2018-12-10 20:37 ns/
0 2018-12-10 20:37 ns/__pycache__/
0 2018-12-10 20:37 EGG-INFO/
这是第一个zip文件仅包含文件,但第二个zip文件也包含这些文件的目录。并且似乎有所作为。
我的问题是:这是setuptools
还是python的zipimport
模块的错误?