Изменение интерпретатора точки входа console_script для упаковки

Я упаковываю некоторые пакеты python, используя известную стороннюю систему упаковки, и я сталкиваюсь с проблемой с тем, как создаются точки входа.

Когда я устанавливаю точку входа на моем компьютере, точка входа будет содержать shebang, указываемую на любом интерпретаторе python, например:

в /home/me/development/test/setup.py

from setuptools import setup
setup(
    entry_points={
        "console_scripts": [
            'some-entry-point = test:main',
        ]
    }
)        

в /home/me/.virtualenvs/test/bin/some-entry-point:

#!/home/me/.virtualenvs/test/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'test==1.0.0','console_scripts','some-entry-point'
__requires__ = 'test==1.0.0'
import sys
from pkg_resources import load_entry_point

sys.exit(
   load_entry_point('test==1.0.0', 'console_scripts', 'some-entry-point')()
)

Как вы можете видеть, шаблонная точка входа содержит жестко закодированный путь к интерпретатору python, который в виртуальной среде, которую я использую для создания моего стороннего пакета.

Установка этой точки входа с использованием сторонней упаковочной системы приводит к тому, что точка входа устанавливается на машине. Однако с этой жестко закодированной ссылкой на интерпретатор python, который не существует на целевой машине, пользователь должен запустить python /path/to/some-entry-point.

Шэбан делает это довольно непропорциональным. (что, конечно же, не является целью дизайна virtualenv, но мне просто нужно сделать это немного более портативным здесь.)

Я бы предпочел не прибегать к сумасшедшим командам find/xargs/sed. (Хотя это мой запасной.)

Есть ли способ изменить путь интерпретатора после shebang, используя флаги или конфиги setuptools?

Ответ 1

Вы можете настроить строку shebang console_scripts, установив "sys.executable" (узнал об этом из отчета debian bug). То есть...

sys.executable = '/bin/custom_python'

setup(
  entry_points={
    'console_scripts': [
       ... etc...
    ]
  }
)

Лучше хотя бы включить аргумент "execute" при создании...

setup(
  entry_points={
    'console_scripts': [
       ... etc...
    ]
  },
  options={
      'build_scripts': {
          'executable': '/bin/custom_python',
      },
  }
)

Ответ 2

Просто измените shebang вашего setup.py, чтобы он соответствовал питону, который вы хотите использовать для своих точек входа:

#!/bin/custom_python

(Я пробовал ответить @damian, но не работал у меня, возможно, версия setuptools на Debian Jessie слишком стар)

Ответ 3

В будущем для тех, кто хочет это сделать во время выполнения без изменения setup.py, можно передать путь интерпретатора к setup.py build через pip с помощью:

$ ./venv/bin/pip install --global-option=build \
--global-option='--executable=/bin/custom_python' .
...
$ head -1 ./venv/bin/some-entry-point
#!/bin/custom_python