比较早接触到setuptools是在写pytest的plugin时,研究了一下pytest是如何通过setuptools中设置的名为pytest11entry_points来加载pip install的pytest plugin的。后来偶然间研究一些cmdline的库时,发现通过名为console_scriptsentry_points可以非常方便地把某个python函数注册到环境变量PATH中对应的一个可执行文件中,而不需要自己写setup脚本来做这件事情了。顿时觉得setuptools好强大。

关于怎么使用setuptools,可以参考官方文档或一些开源的cmdline工具(比如virtualenv)。以下,仅记录我使用setuptools库的一些经验(目前还不是很丰富。。):

  1. 使用python setup.py sdist 命令来在当前目录下生成打包好的文件,方便检查是否所有需要打包的文件都被打包了。

  2. 使用 python setup.py install 命令来把打包好的package安装到当前Python环境中,方便在布之前先在本地安装进行测试。

  3. 如果需要打包的文件包含非Python package文件(比如一些资源文件),则需要在setup.py同级目录下新建一个MANIFEST.in文件,在其中包含需要额外打包的文件,比如:

    recursive-include splunk_env_switcher/ansible_playbooks *.yml *.py
    include splunk_env_switcher/ansible.cfg
    

    并且,在setup.py中的setuptools.setup方法中添加include_package_data=True的参数。

  4. 使用以下命令可以根据当前目录下的setup.py打包发布到指定的pypi服务器:

    sudo python setup.py sdist upload -r https://specified-pypi-server
    
  5. 一些有用的entry_points

    • console_scripts: 绑定指定的package中的函数到某个环境变量(作为cmdline工具),比如:

      entry_points={
          'console_scripts': ['virtualenv=virtualenv:main'],
      }
      
    • pytest11: pytest官方定义的entry_point,用来识别通过pip install的pytest plugin,比如:

      entry_points={
          'pytest11': [
              'xdist = xdist.plugin',
              'xdist.looponfail = xdist.looponfail',
              'xdist.boxed = xdist.boxed',
          ],
      }