2010-08-26 9 views
7

Ich wundere mich über die richtige/einfachste/am meisten Python Art der Umgang mit Teilprojekten, die Sie haben möchten, mit dem gleichen Basispaket. Wir haben im Moment eine Dateistruktur wie dieses:Wie verwaltet man mehrere Python-Unterprojekte mit setuptools?

trunk\ 
    proj1\setup.py 
      company_name\__init__.py + proj1's code 
    proj2\setup.py 
      company_name\__init__.py + proj2's code 

Wir wollen den Namespace company_name halten, die für alle unsere Projekte (? Vielleicht dies selbst ist unpythonic), aber wenn proj1 und proj2 im Modus entwickeln installiert, die erste installiert wird gebrochen. Es sieht so aus, als ob import company_name... verwirrt wird, auf welchem ​​companion_name-Paket nachgesehen werden soll, und es ergreift den ersten/letzten/zufälligen.

Wie würde das normalerweise in einem größeren Python-Projekt gehandhabt? Ist es möglich, dies mit einem setup.py im Kofferraum zu lösen, der eine Art Mega-Ei baut? Ich habe keine relevanten Informationen auf Google oder Stack gefunden, so dass alle Informationen auch nur Links sehr geschätzt werden!


edit: Ich habe gerade versucht, eine setup.py im Stammordner Hinzufügen mit

...  
namespace_packages = ['company_name'], 
package_dir = {'company_name' : ['proj1/company_name', 'proj2/company_name']} 
... 

mit entsprechenden pkg_resources.declare_namespace(__name__) in den __init_.py Dateien, aber ./setup.py bdist_egg gibt nur:

Fehler in company_name Setup-Befehl: Distribution enthält keine Module oder Pakete für das Namespace-Paket 'company_name'

Antwort

6

Während ich nicht für die Pythonity meiner Lösung bürgen kann, habe ich schließlich die verschiedenen Anwendungen zusammen laufen in Ordnung bekommen. Ich war auf dem richtigen Weg mit den Namespacepaketen, aber anstatt zu versuchen, ein Superprojekt im Stamm zu haben, fügte ich die Zeile namespace_packages in der setup.py jedes einzelnen Projekts hinzu. Dies führte dazu, dass das Verhalten ordnungsgemäß funktionierte, wenn es zusammen installiert wurde und den Namespace company_name wie vorgesehen teilte.

Jeder, der auf ob es eine vernünftige Python-Lösung ist, möchte ich hören, ob es "wie es ist" ist. Es fühlt sich richtig an, aber das könnte daran liegen, dass es den Java-Stil nachahmt, an den ich gewöhnt bin.

+3

Dafür habe ich das Schlüsselwort 'namespace_packages' entworfen, und Sie haben es tatsächlich richtig gemacht. –

+0

Meine Firma begann mit Namespacepaketen und es wurde ein großer Fehler mit vielen Funktionen, die mit ihnen in normalen Projekten (laufende Komponententests, Installationen sind knifflig, usw.) gebrochen werden. Nur ein Wort der Warnung. – Lucas