setup.py - 安装后将模块符号链接到/ usr / bin

时间:2014-07-07 13:25:46

标签: python linux setup.py

我几乎已经完成了一个python包的开发,并且还使用distutils编写了一个基本的setup.py:

#!/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()调用之后在末尾写复制代码,那么每次都会调用它。我只是希望在安装程序时完成它。

3 个答案:

答案 0 :(得分: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='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将被调用setup.py脚本的python版本替换。所以明智地写下你的剧本。

答案 1 :(得分:2)

现在您应该使用console_scripts让您的脚本以/usr/bin结尾。格式为:

from setuptools import setup

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

答案 2 :(得分:0)

现在可以在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',
    ]
}