Can you include a standalone executable in a Python package with pyproject.toml?

Can you include a standalone executable in a Python package with pyproject.toml?

Looking at Python packaging with pyproject.toml, I wonder whether it is possible to add a standalone executable (with #!/usr/bin/env python in the first line) to pyproject.toml, without going for a [project.scripts] entrypoint definition and the corresponding auto-generated wrapper. Do I understand right that pyproject.toml supports only the [project.scripts] entrypoint definitions as a way to define executables?

I don't have anything against the entrypoints. It makes the definition of Python executables platform-independent. But it's just a curious aspect of pyproject.toml.

Specifically, is it possible to have a project like this:

pyproject.toml
my_executable.py
my_packet/
  __init__.py
  my_module.py

Where my_executable.py has the +x permissions bits for execution and contains code like this:

#!/usr/bin/env python
from my_packet.my_module import func

def main():
    return func()

if __name__ == '__main__':
    main()

For completeness, the same in the entrypoint way:

pyproject.toml
my_packet/
  __init__.py
  my_module.py
  my_executable.py

With pyproject.toml:

...
[project.scripts]
my-executable = "my_packet.my_executable:main"

Where my_executable.py is:

from my_packet.my_module import func

def main():
    return func()

# may not have if __name__ at all
# or contain not application code
# like some tests

Then the executable gets generated during installation. And it looks like this:

#!/home/.../my_venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from my_packet.my_executable import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

Answer

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answe que r

Enjoyed this article?

Check out more content on our blog or follow us on social media.

Browse more articles