Wie bekomme ich meine setup.py, um einen relativen Pfad zu meinen Dateien zu verwenden?

Ich versuche, eine Python-Verteilung mit distutils zu bauen. Leider sieht meine Verzeichnisstruktur so aus:

 /Code
     /mein Paket
         __init__.py
         File1.py
         File2.py
         / Unterpaket
             __init__.py
     /bauen
         Setup.py

Hier ist meine setup.py Datei:

 from distutils.core import setup setup( name = 'MyPackage', description = 'This is my package', packages = ['mypackage', 'mypackage.subpackage'], package_dir = { 'mypackage' : '../mypackage' }, version = '1', url = 'http://www.mypackage.org/', author = 'Me', author_email = 'me@here.com', ) 

Wenn ich python setup.py sdist es korrekt generiert die manifest-Datei, aber nicht enthalten meine Quelldateien in der Distribution. Anscheinend erstellt es ein Verzeichnis, das die Quelldateien (dh mypackage1 ) enthält, und kopiert dann jede der Quelldateien in mypackage1/../mypackage die sie außerhalb der Distribution bringt.

Wie kann ich das korrigieren, ohne dass ich meine Verzeichnisstruktur dazu veranlasse, mich anzupassen, was distutils erwartet?

  • Installiere Paket, das setup_requires von lokalen Quellendistributionen hat
  • Mit Sphinx mit einer distutils gebauten C-Erweiterung
  • Warum macht setup.py den Inhalt des Namespaces vor der Installation?
  • Setup.py: run build_ext vor noch etwas
  • Python distutils - Änderungspfad RPM installiert
  • Auswählen der GCC-Version beim Aufbau (setup.py)
  • 5 Solutions collect form web for “Wie bekomme ich meine setup.py, um einen relativen Pfad zu meinen Dateien zu verwenden?”

    Welche Verzeichnisstruktur möchten Sie innerhalb der Distributionsarchivdatei? Das gleiche wie deine bestehende Struktur?

    Sie können alles ein Verzeichnis höher ( code in Ihrem Beispiel) mit diesem modifizierten setup.py:

     from distutils.core import setup setup( name = 'MyPackage', description = 'This is my package', packages = ['mypackage', 'mypackage.subpackage'], version = '1', url = 'http://www.mypackage.org/', author = 'Me', author_email = 'me@here.com', script_name = './build/setup.py', data_files = ['./build/setup.py'] ) 

    Sie würden das laufen (im code Verzeichnis):

     python build/setup.py sdist 

    Oder, wenn du dist behalten willst dist

     python build/setup.py sdist --dist-dir build/dist 

    Ich mag die Verzeichnisstruktur, die du versuchst. Ich habe nie gedacht, setup.py war speziell genug, um zu garantieren, dass in der Root-Code-Ordner. Aber wie es oder nicht, ich denke, das ist, wo Benutzer Ihrer Verteilung erwarten wird, dass es sein wird. Also ist es keine überraschung, dass du distutils trickst, um etwas anderes zu tun. Der Parameter data_files ist ein Hack, um dein Setup in die Verteilung an der gleichen Stelle zu bringen, die du gefunden hast.

    Führen Sie setup.py aus dem Stammordner des Projekts aus

    In Ihrem Fall legen Sie setup.py in Code /

    Code / sollte auch enthalten:

    • LICENSE.txt
    • README.txt
    • INSTALL.txt
    • TODO.txt
    • CHANGELOG.txt

    Wenn du "setup.py sdist" laufst, sollte es automatisch einen MANIFEST geben, der Folgendes enthält: – alle in py_modules und / oder Paketen angegebenen Dateien – setup.py – README.txt

    Um weitere Dateien hinzuzufügen, musst du einfach die MANIFEST-Datei bearbeiten, um alle anderen Dateien einzuschließen, die dein Projekt benötigt.

    Für eine etwas anständige Erklärung dafür lese dies .

    Um ein Arbeitsbeispiel zu sehen, kasse mein Projekt .

    Anmerkung: Ich setze den MANIFEST nicht unter Versionskontrolle, damit du ihn dort nicht findet.

    Ein ähnlicher lahmer Workaround, aber ich würde wahrscheinlich nur ein Makefile verwenden, das rsynced ./mypackage zu ./build/mypackage und dann die übliche distutils Syntax von innen ./build. Tatsache ist, distutils erwartet, dass setup.py in die Wurzel der sdist entpacken und Code unter dort haben, also wirst du einen Teufel der Zeit haben, um es zu überzeugen, anders zu tun.

    Sie können immer die Kopie nuke, wenn Sie sauber machen, so dass Sie nicht haben, um Ihre vcs zu verwirren.

    Auch eine lahme Problemumgehung, aber eine Verknüpfung / Verknüpfung des Paketverzeichnisses innerhalb des Buildprojekts sollte funktionieren.

    Habe es zuerst in das übergeordnete Verzeichnis gewechselt?

     import os os.chdir(os.pardir) from distutils.core import setup 

    etc.

    Oder wenn du es irgendwo laufen möchtest (das ist Overkill, aber …):

     import os.path my_path = os.path.abspath(__file__) os.chdir(os.normpath(os.path.join(my_path, os.pardir))) 

    Etc. Nicht sicher, das funktioniert, aber sollte leicht zu versuchen.

    Python ist die beste Programmiersprache der Welt.