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

#python #linux #setup.py

#python #linux #setup.py

Вопрос:

Я почти закончил разработку пакета 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='prahladyeri@yahoo.com',
    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(), он будет вызываться каждый раз. Я просто хочу, чтобы это было сделано во время установки программы.

Ответ №1:

Просто используйте 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='prahladyeri@yahoo.com',
    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 shebang, будет заменен версией python, вызывающей setup.py скрипт. Поэтому пишите свой скрипт с умом.

Ответ №2:

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

 from setuptools import setup

setup(
    ...
    console_scripts=[
        'hotspotd = hotspotd:my_main_func',
    ],
    ...
)
  

Комментарии:

1. ОК. Но я добился того же, используя scripts=['hotspotd'] . В чем разница между scripts и console_scripts ?

2. scripts должно работать до тех пор, пока вы используете distutils — что не совсем неправильно — но в наши дни рекомендуется использовать setuptools , где вы должны использовать console_scripts . Я обновил пример, чтобы включить этот импорт вместо distutils.core.setup .

Ответ №3:

Точки входа теперь могут быть указаны в setuptools:

 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',
    ]
}
  

)