【问题标题】:Python setuptools symlinks and custom install extensionPython setuptools 符号链接和自定义安装扩展
【发布时间】:2018-03-16 17:13:01
【问题描述】:

我想为我的具有 setup.py 并使用 setuptools 的 python 包实现以下两个目标:

  1. 允许使用符号链接进行安装,而不是复制包 文件
  2. 允许自定义代码在使用“安装”时运行 setup.py

首先,我通常这样 pip:

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 install --user

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

【问题讨论】:

    标签: python setuptools packaging


    【解决方案1】:

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

    • “真实”安装模式通过python setup.py install 调用,并将复制源代码,
    • “开发”模式通过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
    Created temporary directory: /private/var/folders/_y/2qk6029j4c7bwv0ddk3p96r00000gn/T/pip-ephem-wheel-cache-1yw7baz2
    ...
    Installing collected packages: spam
      Running setup.py develop for spam
        Running command python -c "import setuptools"
        Running command /Users/hoefling/.virtualenvs/stackoverflow/bin/python -c "import setuptools, tokenize;__file__='/Users/hoefling/projects/private/stackoverflow/so-49326214/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" develop --no-deps
        running develop
        running custom develop command
        running egg_info
    ...
    Successfully installed spam
    Cleaning up...
    

    【讨论】:

    • 完美。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多