Python package setup script install binary executable

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-10 09:21:38

问题


I have a package awesomepkg with setup.py. I'd like to install a binary executable awesometool to the command line along with the package itself when users run pip install awesomepkg. I have compiled different OS versions for awesometool, which lives in a bin/ folder beside setup.py.

However, I can't find a good way to configure setup.py. I have attempted the following:

  1. Use the scripts=[] keyword in setup(). Unfortunately, the "executable" must be a python script.

  2. So I try to wrap the binary in a python script using os.system('bin/awesometool') to delegate. It also fails because the wrapper script is copied somewhere else by pip, so it doesn't know where the relative path bin/awesometool is.

  3. Another potential solution is the data_files keyword. However, for some reason the data files are not copied over to site_packages installation dir, even though running python setup.py bdist_wheel says they have been copied.

Reference: https://docs.python.org/3/distutils/setupscript.html


回答1:


I just ran into this issue myself. My solution was three-fold.

  1. I added the program, e.g. awesometool, to my package structure so I could add it via the package_data keyword: package_data={'awesomepkg': ['awesometool']}. This causes it to actually be copied into the same folder as the main init.py during installation.

  2. I made a python script similar to your step 2. However, instead of the relative path, I first import awesomepkg and use awesomepkg.__path__ to get the absolute path to the installation folder for the package. This would look like:

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

    I also used subprocess instead of system, but the result should be the same.

  3. I added this script to the scripts keyword of setup()




回答2:


From within a package can use

import os
command = os.path.join(os.path.dirname(__file__), "awesometool")


来源:https://stackoverflow.com/questions/46142938/python-package-setup-script-install-binary-executable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!