10

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

3 Answers 3

6

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()

Sign up to request clarification or add additional context in comments.

2 Comments

Shortly speaking just to sum it up, you have made a Python wrapper script and added it to the scripts keyworkd of setup().
I ran into problem here, I get error Permission denied because of the ownership of the binary file. How can I tackle this problem?
1

To add on to Nick Porubsky's answer:

  1. Ensure the binaries have got execute flag enabled when you commit them chmod +x
  2. Ensure you have a shebang on your bash script so it knows to execute with Python

An example of this can be found here. https://github.com/HousekeepLtd/pywkher/commit/0bad81240f16479550e2b1bf2c1185a20d3cee29

Comments

0

From within a package can use

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.