2013-01-19 8 views
7

Angenommen, Sie haben ein Projekt proj genannt und in diesem Projekt, das Sie die folgende Struktur haben:setup.py: Umbenennung src Paket Projektnamen

proj/ 
    dists/ 
    doc/ 
    src/ 
    __init__.py 
    xyz.py 
    abc.py 
    test/ 
    setup.py 

Wie können Sie den gesamten Inhalt Ihres Projekts sehen, ist in der Unterordner src. Wie man ein distutils Verteilungspaket aus dem src Faltblatt heraus bildet?

Mein naive Idee, nach the tutorial, habe, die setup.py so schreiben:

#omitting basics 
setup(
    name='proj', 
    packages=['src'], 
    package_dir={'proj':'src'} 
) 

Aber nach dem resultierenden Paket zu meinem System installieren, ich habe noch src.xyz importieren und nicht proj.xyz, die wäre das Ziel und das erwartete Ergebnis gewesen.

Antwort

-3

Sie können versuchen, Hinzufügen des src Ordner in den PYTHONPATH, bevor Sie die setup Funktion aufrufen:

import sys, os 
src_path = os.path.join(os.path.realpath(os.path.dirname(__file__)), 'src') 
sys.path.append(src_path) 

Und auch, nur um auf der sicheren Seite zu sein, ändern Sie dann das Arbeitsverzeichnis:

os.chdir(src_path) 

Danach sollte alles in Ordnung sein.

Einige andere Tools zum Verpacken Ihrer App unterstützen das von innen. Ich dachte, es wären Setuptools, es stellt sich heraus, dass es PyInstaller ist. Aber im Grunde sollte das so sein, gerade genug, damit Ihre Pakete direkt importiert werden können.

Stellt sich heraus distuts hat die package_dir Direktive. Das ist, was Sie verwenden sollten, aber es könnte funktionieren, indem Sie nur Ihr Paket zu PYTHONPATH hinzufügen.

+1

ich bin nicht sicher, dass Sie das Problem noch bekommen. Ich versuche ein Python-Paket zu schreiben, das andere Leute einfach selbst installieren können. Es geht nicht nur darum, Sachen zu importieren, die Sie in einem anderen Ordner geschrieben haben. – erikbwork

+0

Ja, ich verstehe, aber die 'setup.py' muss Sachen in einen anderen Ordner importieren, um zu funktionieren. Sobald diese Pakete in Ihrem PYTHONPATH sind, ist es egal, wo sie sich befinden. Wenn es für dich nicht funktioniert hat, musst du einen anderen Weg finden, sorry. – jadkik94

+0

Sorry, aber das ist nicht das Problem. – erikbwork

4

Sie können das Problem beheben, indem Python setzen Paketdateien in proj/ Verzeichnis:

proj/ 
    src/ 
    proj/ 
     __init__.py 
     xyz.py 
     abc.py 
    setup.py 

und Ändern setup.py zu:

# ... 
setup(
    name='proj', 
    packages=['proj'], 
    package_dir={'':'src'} 
) 

Es ist nicht von distutils erforderlich, aber andere Werkzeuge könnten das übergeordnete Verzeichnis erwarten Name der Datei __init__.py, die dem Python-Paketnamen entspricht, dh in diesem Fall proj.

+0

Ich habe das getan und es funktioniert. Nicht sicher, ob ich deinen letzten Kommentar verstehe. Sie meinen, dass es Werkzeuge gibt, die von mir erwarten, dass eine Ordnerstruktur wie 'proj/src/proj' so funktioniert wie erwartet? Scheint so ineffizient. Oder mache ich hier etwas Ineffizientes? – erikbwork

+0

Ich meinte, dass der Verzeichnisname:. '/__ init __ py' das gleiche wie Python Paketnamen heißt sein sollte, wenn ich' siehe __init __ py' dann nur, indem du das übergeordnete Verzeichnis Namen suchen Ich weiß, was Python-Paket ist.. – jfs

2

Dies ist aufgrund eines Fehlers in Setuptools hier berichtet: https://github.com/pypa/setuptools/issues/250

Grundsätzlich funktioniert es aber nicht in dev-Modus.Jetzt auf Sie haben drei Lösungen:

  • Symlink das src Paket als proj (und es zu ignorieren, wenn comitting), wird es aus der Box funktioniert, aber ist schmutzig
  • Änderung src-proj
  • erstellen Unterverzeichnis proj in src und die folgenden Optionen verwenden:
 
packages=['proj'], 
package_dir={'proj': 'src/proj'}, 
+0

Link zu Setuptools Ausgabe: https://github.com/pypa/setuptools/issues/250 –

+0

Ausgabe jetzt 3.5+ geschlossen ist – Daniel