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