Python setuptools 符号链接和自定义安装扩展

Python setuptools symlinks and custom install extension

我想为我的 python 包实现以下两个功能,该包具有 setup.py 并使用设置工具:

  1. 允许使用符号链接安装而不是复制包 文件
  2. 当 "install" 与 setup.py

对于第一个,我通常这样做:

pip install -e . --user

而且效果很好。

第二个,我在 setup.py:

from __future__ import print_function                                                                                                                
from setuptools import setup                                                                                                                         
from setuptools.command.install import install                                                                                                       
import os                                                                                                                                            


class CustomInstallCommand(install):                                                                                                                 
    def run(self):                                                                                                                                   
        print ("Custom code here")                                                                                                  
        install.run(self)                                                                                                                            

setup(...,
packages=['package_name'],                                                                                                                         
      package_dir={'package_name':'package_name'},                                                                                                           
      cmdclass={'install': CustomInstallCommand},                                                                                                    
      zip_safe=False)     

但是,我发现:

  1. 如果我运行 pip 如上,自定义代码永远不会被调用
  2. 自定义代码 运行 如果我这样做:

    python setup.py 安装 --user

但我不确定如何将此命令与等效的 -e 选项一起使用,以便安装符号链接而不是文件副本。我怎样才能同时实现这两个目标?

那是因为 install 不会被调用。有两种模式可用:

  • "real" 安装模式通过 python setup.py install 调用并将复制源,
  • "development" 模式通过 python setup.py develop 调用,并且只会创建指向源的符号链接。

因此,您必须以与 install 相同的方式覆盖 develop 命令:

from setuptools.command.develop import develop

...

class CustomDevInstallCommand(develop):
    def run(self):
        print('running custom develop command')
        super(CustomDevInstallCommand, self).run()


setup(
    ...,
    cmdclass={
        'install': CustomInstallCommand,
        'develop': CustomDevInstallCommand,
    },
)

通过 pip install --editable . 安装产生:

$ pip install --editable 。 -v
创建的临时目录:/private/var/folders/_y/2qk6029j4c7bwv0ddk3p96r00000gn/T/pip-ephem-wheel-cache-1yw7baz2
...
安装收集的包:垃圾邮件
  运行 setup.py 针对垃圾邮件进行开发
    运行 命令 python -c "import setuptools"
    运行 命令 /Users/hoefling/.virtualenvs/Whosebug/bin/python -c "import setuptools, tokenize;__file__='/Users/hoefling/projects/private/Whosebug/so-49326214/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" 开发 --no-deps
    运行 发展
    <b>运行自定义开发命令</b>
    运行 egg_info
...
成功安装垃圾邮件
打扫干净...