2016-10-25 2 views
4

Ich habe folgende Projektstruktur:Warum hängt das Verhalten von find_packages vom Import des Pip-Pakets ab?

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) 

Der Rest der Dateien leer sind. Umgebung - Debian-Test. Python 3.5.

run1.py Ausgang:

$ python3 run1.py 
prog 

run2.py Ausgang:

$ python3 run2.py 
prog 
tests.subpak 

Das heißt, wenn find_packages nach pip importiert wird, ist es nicht ausgeschlossen längeren Unterpakete ausgeschlossenen Pakets. Warum passiert das und welche Mechanismen sind an diesem eigenartigen Verhalten beteiligt?

bearbeiten: Es scheint, dass Pip oder einige seiner Abhängigkeiten syspath ändern, und setuptools Module sind unterschiedlich. 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

Dumme Frage: Warum importieren Sie 'Pip' in erster Linie? –

+0

@MartijnPieters der Code oben ist Demo des Problems, das ich beim Arbeiten mit tatsächlichen setup.py-Skript, die einige pip-Funktionen verwendet aufgetreten ist: 'von pip.req import parse_requirements' – DarkPhoenix

+0

Welche Version von' pip' und welche Version von ' Rüstzeug? Ich kann das nicht mit 8.1.2 und setuptools 27.2.0 reproduzieren. Ich bekomme die * zweite Ausgabe * für diesen. –

Antwort

1

pip Importe wheel Unterstützung, und dies scheint ein Rad zu entsperren Sie nicht wissen, haben Sie hatte:

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

Ohne das Rad Sie sind Importieren einer systemweiten setuptools Version:

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

Diese Version scheint gebrochen zu werden, weil test.subpack sollte aufgenommen werden (es herauszufiltern von 'tests.*' zur exclude Liste hinzufügen).

+0

Danke. Im Quellcode von pip wurde eine Zeile gefunden, die sys.path vorangestellt hat: https://github.com/pypa/pip/blob/master/pip/_vendor/__init__.py#L58 – DarkPhoenix

Verwandte Themen