python setup.py configuration to install files in custom directories

Question:

I want to create a setup.py which would install my files into custom directories. I have a certain prefix, where I would like to get the following result:

/my/prefix/
  bin/
    script.sh
  libexec/
    one.py
    two.py
    ...
  lib/pythonX.Y/site-packages/
    package/...

My initial project is following:

/
  script.sh
  one.py
  two.py
  ...
  setup.py
  package/...
    __init__.py
    ...

What would be the best way to achieve that? I would like to be able to install it later with something like:

python setup.py install --prefix=/my/prefix

I can get "package" nicely installed in the correct directory as lib/pythonX.Y/site-packages under --prefix is the default location. But is there a clean way to get script.sh into "bin" and other python files into "libexec"? The only way I see to achieve that would be to manually copy those files in my setup.py script. Maybe there is a cleaner and more standard way to do that?

Asked By: Ago

||

Answers:

The scripts are handled by use of the scripts parameter to the setup function. For libexec you can treat them as data files and use a data options.

setup(...
    scripts=glob("bin/*"),
    data_files=[(os.path.join(sys.prefix, 'libexec', 'mypackage'), glob("libexec/*"))],
    ...
)

I’m not sure how that would work with a --prefix option, I’ve never tried that.

Answered By: Keith

I ended up with setup.py like that:

setup(name='mylib',
  scripts=['script.sh'],
  data_files=[('libexec', ['one.py', 'two.py'])]
)

Of course, you could iterate over all python files for libexec, but I only have 2-3 python files I need there.


Additionally, I can have setup.cfg with the following:

[install]
prefix=/my/prefix

and instead of python setup.py install --prefix=/my/prefix I can just do:

python setup.py install

This answer was posted as edits (edit 1, edit 2) to the question python setup.py configuration to install files in custom directories by the OP Ago under CC BY-SA 3.0.

Answered By: vvvvv