2009-05-01 6 views
9

Ich versuche, eine Python-Distribution mit distutils zu erstellen. Leider sieht meine Verzeichnisstruktur wie folgt aus:Wie kann ich mit setup.py einen relativen Pfad zu meinen Dateien erstellen?

 
/code 
    /mypackage 
     __init__.py 
     file1.py 
     file2.py 
     /subpackage 
      __init__.py 
    /build 
     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 = '[email protected]', 
) 

Wenn ich python setup.py sdist laufen erzeugt sie korrekt die Manifest-Datei, ist aber nicht meine Quelldateien in der Distribution enthalten . Offensichtlich erstellt es ein Verzeichnis, um die Quelldateien zu enthalten (d. H.) und kopiert dann jede der Quelldateien nach mypackage1/../mypackage, was sie außerhalb der der Distribution setzt.

Wie kann ich das korrigieren, ohne dass meine Verzeichnisstruktur dem entspricht, was distutils erwartet?

Antwort

0

Eine sorta lame Abhilfe, aber ich würde wahrscheinlich nur ein Makefile verwenden, das ./mypackage zu ./build/mypackage rsynced und dann die übliche distutils Syntax von innen ./build. Tatsache ist, dass distutils erwartet, dass sie setup.py in den Stammordner des sdist entpackt und Code unter sich hat, so dass Sie eine Menge Zeit haben werden, es zu überzeugen, etwas anderes zu tun.

Sie können immer die Kopie nuken, wenn Sie sauber machen, damit Sie Ihre vcs nicht durcheinander bringen müssen.

4

Welche Verzeichnisstruktur möchten Sie in der Datei des Verteilungsarchivs haben? Das gleiche wie Ihre bestehende Struktur?

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

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 = '[email protected]', 
    script_name = './build/setup.py', 
    data_files = ['./build/setup.py'] 
) 

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

python build/setup.py sdist 

Oder, wenn Sie dist innerhalb von Build behalten möchten:

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

Ich mag die Verzeichnisstruktur, die Sie versuchen. Ich habe nie gedacht, dass setup.py speziell genug war, um im Root-Code-Ordner zu sein. Aber ob es Ihnen gefällt oder nicht, ich denke, dass die Nutzer Ihrer Distribution das erwarten. Es ist also nicht verwunderlich, dass Sie etwas austricksen müssen, um etwas anderes zu tun. Der Parameter data_files ist ein Hack, um Ihre setup.py-Datei an derselben Stelle in die Distribution zu bringen, an der Sie sie gefunden haben.

+5

Es ist mir egal, wie die Struktur in der Verteilungsdatei aussieht, solange sie das Richtige tut, wenn Benutzer versuchen, sie mit easy_install zu installieren. Aber die Python-Dokumentation ist absolut schrecklich, wenn es um diese Details geht - ich habe keine Ahnung, wie die Struktur überhaupt aussehen soll. Und ich denke immer noch daran, dass Sie ein Skript in der Distribution ausführen, bevor es installiert wird, um die Distribution zu installieren. –

0

Haben Sie vielleicht zuerst das übergeordnete Verzeichnis?

import os 
os.chdir(os.pardir) 

from distutils.core import setup 

usw.

Oder wenn Sie es von überall (das ist übertrieben, aber ...) könnte ausgeführt werden:

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

etc. Nicht sicher, dass dies funktioniert, aber sollte es sein einfach zu versuchen.

1

Setup ausführen.py aus dem Stammordner des Projekts

In Ihrem Fall Platz setup.py in Code/

Code/sollte auch gehören:

  • LICENSE.txt
  • README.txt
  • INSTALL.txt
  • todo.txt
  • CHANGELOG.txt

Die, wenn Sie „setup.py Sdist‘ laufen soll es auto-gen ein MANIFEST einschließlich: - alle angegebenen Dateien in py_modules und/oder Paketen - setup.py - README.txt

zu Fügen Sie weitere Dateien hinzu, bearbeiten Sie die MANIFEST-Datei manuell, um alle anderen Dateien aufzunehmen, die Ihr Projekt benötigt.

Für eine etwas anständige Erklärung dieser read this.

Um ein funktionierendes Beispiel Kasse my project zu sehen.

Hinweis: Ich stelle das MANIFEST nicht unter Versionskontrolle, damit Sie es dort nicht finden.

0

Auch eine lahme Problemumgehung, aber eine Junction/Link des Paketverzeichnisses innerhalb des Build-Projekts sollte funktionieren.

Verwandte Themen