Python打包:迎合不同的受众

Python打包:迎合不同的受众,python,packaging,setuptools,software-distribution,Python,Packaging,Setuptools,Software Distribution,我正在开发一个Python包,它由一个库模块和两个使用库的脚本组成。其中一个脚本是打印文本的命令行工具,另一个脚本是JSON API服务器。这两个脚本还可以作为希望使用该库的开发人员的示例 在这种情况下,我看到包的三个主要受众或用例: 库用户:需要主模块。可能希望访问用于测试模块的脚本,并将其作为自己代码的存根和示例 CLI用户:希望不时运行CLI脚本。不需要API服务器,并且可能不关心对脚本源的访问 API提供程序:与CLI用户相同,但使用API服务器脚本。可能需要CLI脚本进行快速测试 理想

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

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

  • 库用户:需要主模块。可能希望访问用于测试模块的脚本,并将其作为自己代码的存根和示例

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

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

  • 理想情况下,脚本用户还可以选择是直接从目录还是从$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
    
      [...]
      requires=['pyswisseph', 'numpy'],
      extras_require={'Flask':['flask']},
      entry_points={
          'console_scripts':
              ['cerridwen = cerridwen.cli:main',
               'cerridwen-server = cerridwen.api_server:main [Flask]']
      }
      [...]
    
    这就是我现在所做的

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

    在那里我发现了
    入口点
    参数,该参数允许指定在构建时转换为脚本的模块函数。这些脚本还可能具有额外的依赖项

    为了处理这个问题,我将相应的
    \uuuuuuu主块
    块转换为命名函数,并将它们标记为入口点。相关块(所有
    setuptools.setup()
    parameters)如下所示:

    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
    
      [...]
      requires=['pyswisseph', 'numpy'],
      extras_require={'Flask':['flask']},
      entry_points={
          'console_scripts':
              ['cerridwen = cerridwen.cli:main',
               'cerridwen-server = cerridwen.api_server:main [Flask]']
      }
      [...]
    
    每个人都可以获得模块和脚本,但只有在第一次运行需要它们的脚本时,才会安装可选依赖项。脚本逻辑也将作为主模块的一部分安装,这样每个人都可以根据需要使用其助手功能

    至于以脚本为例,我打算在项目的网站上引用它们的github源代码

    目录结构保持其原始状态

    我希望这能帮助其他人:)