2016-10-25 25 views
4

我有以下項目結構:爲什麼find_packages行爲依賴於pip包的導入?

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_packagespip後導入,它不再排除排除包的子包。爲什麼會發生這種情況,以及這種特殊行爲涉及什麼樣的機制?

編輯: 似乎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

愚蠢的問題:你爲什麼首先要輸入'pip'? –

+0

@MartijnPieters上面的代碼與實際setup.py腳本,這使得一些畫中畫功能,使用工作,而我遇到的問題的演示:'從pip.req進口parse_requirements' – DarkPhoenix

+0

什麼pip'的'版本,什麼版本的' setuptools'?我不能用8.1.2和setuptools 27.2.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列表中將其過濾掉)。

+0

謝謝。在pip源代碼中找到一行代碼,該代碼前置輪到sys.path:https://github.com/pypa/pip/blob/master/pip/_vendor/__init__.py#L58 – DarkPhoenix