python3 setuptools和zip-safe名称空间包

时间:2018-12-10 19:47:18

标签: python-3.x

让我们尝试创建最简单的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模块的错误?

0 个答案:

没有答案