setup.py — Симлинк модуля в /usr/bin после установки

Я почти закончил разработку пакета Python, а также написал базовый setup.py с помощью distutils:

#!/usr/bin/env python
#@author: Prahlad Yeri
#@description: Small daemon to create a wifi hotspot on linux
#@license: MIT
import cli

#INSTALL IT
from distutils.core import setup
setup(name='hotspotd',
    version='0.1',
    description='Small daemon to create a wifi hotspot on linux',
    license='MIT',
    author='Prahlad Yeri',
    author_email='[email protected]',
    url='https://github.com/prahladyeri/hotspotd',
    package_dir={'hotspotd': ''},
    packages=['hotspotd'],
    data_files=[('config',['run.dat'])],
    )

#CONFIGURE IT

Теперь этот скрипт работает идеально, как я хочу. Он устанавливает необходимые файлы в папку с префиксом. Например, приведенная ниже команда:

sudo python setup.py install --prefix /opt

установит весь мой пакет в:

/opt/lib/python2.7/site-packages/hotspotd

Однако я хочу, чтобы основной исполняемый файл hotspotd.py был связан с соответствующим файлом в /usr/bin, например:

/usr/bin/hotspotd

Чтобы пользователь мог запустить мою программу, просто вызвав hotspotd start вместо косвенного вызова через python.

Как я могу добиться этого, изменив setup.py? Если я просто напишу код копирования в конце после вызова setup(), он будет вызываться каждый раз. Я просто хочу, чтобы это было сделано, когда программа устанавливается.


person Prahlad Yeri    schedule 07.07.2014    source источник


Ответы (3)


Просто используйте параметр scripts следующим образом:

#!/usr/bin/env python
#@author: Prahlad Yeri
#@description: Small daemon to create a wifi hotspot on linux
#@license: MIT
import cli

#INSTALL IT
from distutils.core import setup
setup(name='hotspotd',
    version='0.1',
    description='Small daemon to create a wifi hotspot on linux',
    license='MIT',
    author='Prahlad Yeri',
    author_email='[email protected]',
    url='https://github.com/prahladyeri/hotspotd',
    package_dir={'hotspotd': ''},
    packages=['hotspotd'],
    data_files=[('config',['run.dat'])],
    scripts=["scriptname"], # Here the Magic Happens
    )

#CONFIGURE IT

Теперь файл scriptname будет скопирован в /usr/bin/scriptname, шебанг будет заменен версией python, вызывающей setup.py Script. Так что пишите сценарий с умом.

person mjb4    schedule 11.08.2014

В настоящее время вы должны использовать console_scripts, чтобы ваш скрипт попал в /usr/bin. Формат:

from setuptools import setup

setup(
    ...
    console_scripts=[
        'hotspotd = hotspotd:my_main_func',
    ],
    ...
)
person jmagnusson    schedule 03.06.2015
comment
ХОРОШО. Но я добился того же, используя scripts=['hotspotd']. В чем разница между scripts и console_scripts? - person Prahlad Yeri; 03.06.2015
comment
scripts должен работать до тех пор, пока вы используете distutils. не совсем неправильно, но в настоящее время рекомендуется использовать setuptools, где вы должны использовать console_scripts. Я обновил пример, чтобы включить этот импорт вместо distutils.core.setup. - person jmagnusson; 03.06.2015

Точки входа теперь можно указывать в инструментах настройки:

setup(
# other arguments here...
entry_points={
    'console_scripts': [
        'foo = my_package.some_module:main_func',
        'bar = other_module:some_func',
    ],
    'gui_scripts': [
        'baz = my_package_gui:start_func',
    ]
}

)

person gerardw    schedule 18.02.2018