如何制作全局可调用的python程序?

时间:2016-03-29 09:22:17

标签: python terminal command-line-interface setuptools

我写了一个模块并创建了一个setup.py来安装模块:

from setuptools import setup, find_packages

setup(
    name='mymodule',
    version='0.1',
    packages=find_packages(exclude=['test', 'test.*']),
    include_package_data=True,
    platforms='any',
    install_requires=[
        'lxml==3.3.5',
        'Pillow==3.0.0',
        'requests==2.2.1',
        'xmltodict==0.10.1',
        'pdfrw==0.2',
        'python-dotenv==0.4.0',
        'boto==2.39.0'
    ],
)

在同一模块中,我还使用getopt为模块编写了命令行界面。我想使这个命令行界面全局可用,以便系统上的任何用户都可以执行以下操作:

$ mycliprogram -i inputfile.xml -o outputfile.txt

有人知道如何在setup.py中包含mycliprogram.py,以便系统上的任何人都可以在命令行中使用它吗?

2 个答案:

答案 0 :(得分:2)

我会引用documentation

第一种方法是将脚本编写在单独的文件中,例如您可以编写shell脚本:

funniest/
    funniest/
        __init__.py
        ...
    setup.py
    bin/
        funniest-joke
    ...

然后我们可以在setup()中声明脚本:

setup(
    ...
    scripts=['bin/funniest-joke'],
    ...
)

当我们安装软件包时,setuptools会将脚本复制到我们的PATH并使其可供一般使用。:

$ funniest-joke

答案 1 :(得分:1)

您可以使用console-scripts(如谢尔盖建议的那样)或entry_points中的setup()参数:

  entry_points={
      'console_scripts': [
          'mycliprogram=mymodule:whatever',
      ],
  },

这会创建一个myclyprogram包装器,可以通过$PATH访问它,它会在whatever中调用mymodule。因此,如果您通过pipsetup.py安装模块,则可以使用您在命令行提示符下直接定义的任何选项调用mycliprogram

更多信息:Command Line Scripts – Python Packaging Tutorial