2015-05-28 6 views
11

Ich möchte von jemand anderem Python-Dienstprogramm verwenden, foobartools, deren native Umgebung ist Linux. Foobartools ist pure Python, also gibt es keinen Grund, warum es nicht unter Windows verwendet werden kann, wo ich bin.Python: migrieren setup.py "scripts =" zu entry_points

In ihrem setup.py verwenden sie den älteren Stil scripts=['bin/foobar'],.

Das Ausführen von pip install -e b:\code\foobar erstellt eine Datei namens foobar in %pythonhome%\Scripts, aber Windows weiß es nicht, obwohl Skripts in PATH ist. Um es zu verwenden, muss ich eine @python %pythonhome%\scripts\foobar Stapeldatei machen. Dies funktioniert, ist aber nicht optimal (ctrl-c Handhabung ist hässlich zum Beispiel).

Ich weiß, dass wenn ich die neuere hinzufügen und empfohlen entry_points Syntax setup.py pip automatisch Scripts\foobar.exe auf Windows erstellen (und ich kann die Batch-Datei Graben). Unter Linux bleibt Scripts\foobar unverändert, und alle sind glücklich.

entry_points = { 
    'console_scripts': ['foobar = foobartools:main'], 
} 

Ich weiß nicht, was mit der rechten Seite der Gleichung zu tun, foobartools:main. Wie mache ich diesen Anruf bin/foobar? Das Modul foobartools hat keine einzelne aufrufbare Funktion oder ein solches Modul entspricht dem bin-Skript, und das bin-Skript ist relativ kompliziert.

Ich möchte so wenige Änderungen wie möglich an dem Projekt vornehmen, damit a) eine Patch-Einreichung eine bessere Chance hat, upstream akzeptiert zu werden, und b) wenn Upstream uninteressiert bleibt, muss ich weniger tun es.

[Update] Die bestehende Quelle Baumstruktur:

foobartools/ 
    bin/foobar 
    foobartools/ 
     __init__.py 
     foo/ 
      __init__.py 
      one.py 
      two.py 
     bar/ 
      ... 
     baz/ 
      ... 
    setup.py 

Antwort

1

Ich habe auf eine Arbeits Scripts \ foobar.exe, aber es ändert sich mehr des Codes als ich will. Ich hatte gehofft, mit nur ein paar Verbesserungen an setup.py zu kommen, oder zumindest etwas, das sich nicht in Upstream-Modulen herumspielt. Ich weiß es nicht gut genug, um sicher zu sein, dass ich irgendwie nicht in die Quere komme.

(1) bewegen bin/foobar ->foobartools/foobar_cli.py
(2) In setup.py, #scripts=... Kommentar aus und fügen:

entry_points = { 
    'console_scripts': ['foobar = foobartools.foobar_cli:main'], 
} 

[später] Eine Verfeinerung der gleichen Grundidee, eine Einrichtung ich halte meinen Fett Füße aus dem Hauptgeschäftsfeld:

(1) bewegen ./bin/foobar ->./foobar_cli/foobar.py (Anmerkung Erweiterung sowie Ordner ändern)
(2) fügen Sie einen leeren __init__.py zu demselben Ordner hinzu
(3) console_scripts': ['foobar = foobar_cli.foorbar:main'],

+0

Ich denke, dass Sie mit einer sehr vernünftigen Lösung kamen. 'entry_points' funktioniert nur für Skripte, die innerhalb einer bestimmten Funktion in einem der enthaltenen Module gekapselt sind. Ich bin mir eigentlich nicht sicher, warum 'setuptools' eine solche Einschränkung auferlegt: - / –