为什么 find_packages 行为取决于 pip 包的导入?

Why does find_packages behavior depend on import of pip package?

我有以下项目结构:

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 测试。 python3.5.

run1.py 输出:

$ python3 run1.py 
prog

run2.py 输出:

$ python3 run2.py 
prog
tests.subpak

find_packagespip之后导入时,不再排除排除包的子包。为什么会发生这种情况,这种奇怪的行为涉及什么样的机制?

编辑: 似乎 pip 或其某些依赖项正在更改 syspath,并且 setuptools 模块不同。运行 1:

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

第 2 轮:

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

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'> 

此版本似乎已损坏,因为 应该包含 (通过将 'tests.*' 添加到 [=17= 来过滤掉它) ] 列表).