2017-11-13 2 views
0

Ich habe eine benutzerdefinierte Python-Paket folgende this guide erstellt, so habe ich die folgende Struktur:Warum wirkt sich das aktuelle Arbeitsverzeichnis auf den Installationspfad von setup.py aus? Wie verhindere ich das?

mypackage/  <-- VCS root 
    mypackage/ 
    submodule1/ 
    submodule2/ 
    setup.py 

Und setup.py enthält genau die gleichen Informationen wie in der Führung:

from setuptools import setup, find_packages 

setup(name='mypackage', 
     version='0.1', 
     description='desc', 
     url='vcs_url', 
     author='Hodossy, Szabolcs', 
     author_email='[email protected]', 
     license='MIT', 
     packages=find_packages(), 
     install_requires=[ 
      # deps 
     ], 
     zip_safe=False) 

ich bemerkt haben Wenn ich in den Ordner gehe, in dem sich setup.py befindet, und dann python setup.py install in einer virtuellen Umgebung aufrufen, wird in Site-Paketen die folgende Struktur installiert:

.../site-packages/mypackage-0.1-py3.6.egg/mypackage/ 
    submodule1/ 
    submodule2/ 

aber wenn ich es von einem Ordner auf wie python mypackage/setup.py install nennen, dann ist die Struktur die folgenden:

.../site-packages/mypackage-0.1-py3.6.egg/mypackage/ 
    mypackage/ 
    submodule1/ 
    submodule2/ 

dies später eine Ruine alle Einfuhren aus meinem Modul, da der Weg für die Submodule unterscheidet.

Können Sie erklären, was hier passiert und wie Sie diese Art von Verhalten verhindern können?

Dies ist mit Python 3.6 unter Windows und Linux erfahren.

Antwort

1

Ihre setup.py enthält keine Pfade, scheint aber nur die Dateien über find_packages zu finden. Es hängt natürlich davon ab, wo Sie es ausführen. Das setup.py ist nicht unbedingt an seinen Standort gebunden. Natürlich könnten Sie Dinge wie chdir zu basename des Setup-Dateipfads in sys.argv[0] tun, aber das ist ziemlich hässlich.

Die Frage ist, WARUM wollen Sie es so bauen? Es sieht mehr wie Sie möchten eine Struktur wie

mypackage-source 
    mypackage 
    submodule1 
    submodule2 
    setup.py 

Und dann ausführen setup.py aus dem Arbeitsverzeichnis. Wenn Sie es in der Lage sein wollen, von jedem beliebigen Ort zu laufen, desto besser Abhilfe wäre ein Shell zu setzen daneben, wie

#!/bin/sh 
cd ``basename $0`` 
python setup.py [email protected] 

, die die Aufgabe der Veränderung in das richtige Verzeichnis trennt (hier gehe ich davon aus das Verzeichnis mit setup.py im workdir) von running setup.py

+0

Danke für die Antwort, also sollte ich nicht find_packages verwenden, da es inkonsistente Installationen meines Pakets verursachen wird. –

+0

Ich denke, Sie sollten es verwenden, aber stellen Sie sicher, aus welchem ​​Verzeichnis Sie Ihren Build starten. Um es anders auszudrücken: Sie könnten die Datei setup.py von einem beliebigen Verzeichnis aus ausführen und dort die Pakete erstellen, da sie keine absoluten Pfade angeben. Das ist absichtlich, weil Sie nie wissen, wie das Verzeichnis-Layout ist, wo jemand anderes es vielleicht baut. Daher werden die Pakete beginnend mit dem aktuellen Verzeichnis gesammelt. Ich denke, Sie müssen einen Unterordner mehr in der Hierarchie haben, auch wenn es so aussieht, als wäre es überflüssig. So etwas wie '' mypackage-source/mypackage/submodule1'' – allo

Verwandte Themen