Python包装:迎合不同的受众

时间:2014-04-28 11:39:43

标签: python packaging setuptools software-distribution

我正在开发一个Python包,它包含一个库模块和两个使用该库的脚本。其中一个脚本是打印出一些文本的命令行工具,另一个是JSON API服务器。这两个脚本也可以作为希望使用该库的开发人员的示例。

鉴于这种情况,我看到了包的三个主要受众或用例:

  1. 图书馆用户:需要主模块。可能希望访问用于测试模块的脚本以及用于自己代码的存根和示例。

  2. CLI用户:希望不时地运行CLI脚本。不需要API服务器,也可能不关心对脚本源的访问。

  3. API提供程序:与CLI用户相同,但具有API服务器脚本。可能需要CLI脚本进行快速测试。

  4. 理想情况下,脚本用户还可以选择是直接从目录还是从$ PATH运行脚本。

    如何在目录树和一个或多个分发包中(可能使用setuptools)正确地构建它?

    当前的源布局如下:

    main_folder
        README
        setup.py
        mypackage
          __init__.py # contains the library functions
          mymodule.py # link to __init__.py for easy import in the scripts
          cli.py
          api_server.py
    

1 个答案:

答案 0 :(得分:1)

这是我现在所做的。

我浏览了PyPI,寻找类似的软件包,然后查看了wikidump的目录结构及其setup.py

在那里我发现了entry_points参数,它允许指定在构建时转换为脚本的模块函数。这些脚本也可能有额外的依赖关系。

为了解决这个问题,我将各个__main__块转换为命名函数,并将其标记为入口点。相关块(所有setuptools.setup()参数)如下所示:

  [...]
  requires=['pyswisseph', 'numpy'],
  extras_require={'Flask':['flask']},
  entry_points={
      'console_scripts':
          ['cerridwen = cerridwen.cli:main',
           'cerridwen-server = cerridwen.api_server:main [Flask]']
  }
  [...]

每个人都获取模块和脚本,但只有在第一次运行需要它们的脚本时才会安装可选依赖项。脚本逻辑也将作为主模块的一部分安装,以便每个人都可以根据需要使用他们的帮助函数。

至于以脚本为例,我打算在项目的网站上引用他们的github资源。

目录结构保持原始状态。

我希望能帮助别人:)