2016-04-25 9 views
1

Ich habe ein Repository, das ich geerbt habe, das von vielen Teams verwendet wird, viele Skripte nennen es, und es scheint, dass es ein echter Kopfschmerz sein wird, irgendwelche strukturellen Änderungen daran vorzunehmen. Ich möchte diesen Repo irgendwie installierbar machen. Es ist wie folgt strukturiert:Python-Repository ohne übergeordnete Verzeichnisstruktur installieren

my_repo/ 
    scripts.py 

Wenn es mein Repository ist, würde ich wie so die Struktur ändern und es installierbar machen, und führen Sie python setup.py install:

my_repo/ 
    setup.py 
    my_repo/ 
     __init__.py 
     scripts.py 

Wenn dies nicht möglich ist (und es klingt wie es nicht sein könnte), kann irgendwie etwas tun, wie ich: so

my_repo/ 
    setup.py 
    __init__.py 
    scripts.py 

Und fügen sie etwas, das es zu setup.py wissen zu lassen, dass der Repo wie diese lustigen strukturiert ist, dass ich installieren es?

Antwort

1

Sie können tun, was Sie vorschlagen.

Die einzige Sache ist, dass Sie Module in Ihrem Paket über ihren Namen importieren müssen, wenn sie in der Basisebene sind. So zum Beispiel, wenn Ihre Struktur sah wie folgt aus:

my_repo/ 
    setup.py 
    __init__.py 
    scripts.py 
    lib.py 
    pkg/ 
     __init__.py 
     pkgmodule.py 

Dann in scripts.py Ihre Importe wie

from lib import func1, func2 
from pkg.pkgmodule import stuff1, stuff2 

Also in Ihrem Basisverzeichnis Importe sind im Wesentlichen durch Modulnamen nicht durch Paket aussehen könnte. Dies könnte einige Ihrer anderen Packages-Namespaces vermasseln, wenn Sie nicht vorsichtig sind, etwa wenn es eine weitere Abhängigkeit mit einem Paket namens lib gibt. Also wäre es am besten, wenn Sie diese Skripte in einem virtualenv ausführen und wenn Sie testen, um Namespacing nicht durcheinander zu bringen

+0

Vielen Dank! Also sage ich, dass ich außerhalb dieses Repositories bin, dies wird mir erlauben, etwas wie "von my_repo Import-Skripten zu machen; scripts.func1(); '? –

+0

nein, Python wird keine Kenntnis über den Namespace my_repo haben. Sie müssen 'Skripte importieren '; scripts.func1(); ' – Greg

+0

Und kann dies außerhalb der' my_repo/'getan werden? Oder muss ich im selben Verzeichnis wie scripts.py sein? –

1

Es gibt eine Direktive in setup.py Datei, um den Namen eines Pakets zu installieren und von wo es seine Module für die Installation bekommen soll. Dadurch können Sie die gewünschte Verzeichnisstruktur verwenden. Zum Beispiel mit einer bestimmten Verzeichnisstruktur wie:

 my_repo/ 
     setup.py 
     __init__.py 
     scripts.py 

könnten Sie eine setup.py schreiben wie:

 setup(
     # -- Package structure ---- 
     packages=['my_repo'], 
     package_dir={'my_repo': '.'}) 

So jemand den Inhalt my_repo mit dem Befehl“Installation ./setup.py installieren "oder" Pip installieren. " würde mit einer installierten Kopie von my_repo 's Modulen enden.

Als eine Randnotiz; Relativimporte funktionieren in Python 2 und Python 3 anders. Im letzteren Fall müssen alle relativen Importe explizit den Willen angeben, dies zu tun. Diese Methode zur Installation von my_repo wird in Python 3 funktionieren, wenn ein absoluter Import aufgerufen wird:

from my_repo import scripts