为什么find_packages行为依赖于pip包的导入?

时间:2016-10-25 11:06:18

标签: python python-3.x python-3.5

我有以下项目结构:

prog
  __init__.py
tests
  subpak
    __init__.py
  __init__.py
run1.py
run2.py

run1.py:

#!/usr/bin/env python3
from setuptools import find_packages


for i in sorted(find_packages(exclude=['tests'])):
    print(i)

run2.py:

#!/usr/bin/env python3
import pip
from setuptools import find_packages


for i in sorted(find_packages(exclude=['tests'])):
    print(i)

其余文件都是空的。环境 - Debian测试。 python 3.5。

run1.py输出:

$ python3 run1.py 
prog

run2.py输出:

$ python3 run2.py 
prog
tests.subpak

也就是说,在find_packages之后导入pip时,它不再排除已排除包的子包。为什么会发生这种特殊行为?这种特殊行为会涉及到什么样的机制?

编辑: 看来pip或其某些依赖项正在改变syspath,setuptools模块是不同的。 RUN1:

<module 'setuptools' from '/usr/lib/python3/dist-packages/setuptools/__init__.py'>

RUN2:

<module 'setuptools' from '/usr/share/python-wheels/setuptools-20.10.1-py2.py3-none-any.whl/setuptools/__init__.py'>

1 个答案:

答案 0 :(得分:1)

pip导入wheel支持,这似乎可以解锁您不知道的车轮:

<module 'setuptools' from '/usr/share/python-wheels/setuptools-20.10.1-py2.py3-none-any.whl/setuptools/__init__.py'>

没有滚轮,您将导入系统范围的setuptools版本:

<module 'setuptools' from '/usr/lib/python3/dist-packages/setuptools/__init__.py'> 

此版本似乎已被破坏,因为test.subpack 假设包含在内(通过将'tests.*'添加到exclude列表来过滤掉它。)< / p>