2017-09-10 1 views
2

J'ai un paquet awesomepkg avec setup.py. Je voudrais installer un exécutable binaire awesometool à la ligne de commande avec le package lui-même lorsque les utilisateurs exécutent pip install awesomepkg. J'ai compilé différentes versions d'OS pour awesometool, qui vit dans un dossier bin/ à côté de setup.py.Script d'installation du paquet Python installer l'exécutable binaire

Cependant, je ne peux pas trouver un bon moyen de configurer setup.py. J'ai essayé les éléments suivants:

  1. Utilisez le mot-clé dans scripts=[]setup(). Malheureusement, le "exécutable" doit être un script python. Donc, j'essaye d'envelopper le binaire dans un script python en utilisant os.system('bin/awesometool') pour déléguer. Il échoue également car le script wrapper est copié ailleurs par pip, donc il ne sait pas où se trouve le chemin relatif bin/awesometool.

  2. Une autre solution potentielle est le mot-clé data_files. Toutefois, pour une raison quelconque, les fichiers de données ne sont pas copiés dans le répertoire d'installation site_packages, même si l'exécution python setup.py bdist_wheel indique qu'ils ont été copiés.

Référence: https://docs.python.org/3/distutils/setupscript.html

Répondre

4

Je viens de croiser cette question moi-même. Ma solution était triple.

  1. J'ai ajouté le programme, par ex. awesometool, à ma structure de package afin que je puisse l'ajouter via le mot-clé package_data: package_data={'awesomepkg': ['awesometool']}. Cela provoque sa copie dans le même dossier que le init .py principal lors de l'installation.

  2. J'ai fait un script python similaire à votre étape 2. Cependant, au lieu du chemin relatif, je suis importer awesomepkg et utiliser awesomepkg.__path__ pour obtenir le chemin absolu vers le dossier d'installation du package. Cela ressemblerait à ceci:

    import awesomepkg 
    import subprocess as sp 
    import sys 
    
    path = awesomepkg.__path__[0] 
    command = path + "/awesometool" 
    sp.call([command] + sys.argv) 
    

    J'ai aussi utilisé à la place du système sous-processus, mais le résultat devrait être le même.

  3. J'ajouté ce script au scripts mot-clé de setup()

+1

parlant Peu de temps juste pour résumer, vous avez fait un script wrapper Python et ajouté à la keyworkd 'de scripts' de' setup() '. – konstunn

+0

J'ai rencontré un problème ici, j'obtiens l'erreur 'Permission denied' en raison de la propriété du fichier binaire. Comment puis-je résoudre ce problème? – konstunn