我有以下项目结构:
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'>
答案 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>