Python setuptools 符号链接(symbolic link)和自定义安装扩展

标签 python setuptools packaging

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

  1. 允许使用符号链接(symbolic link)安装而不是复制包 文件
  2. 允许自定义代码在与“install”一起使用时运行 设置.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 选项一起使用,以便安装符号链接(symbolic link)而不是文件副本。我怎样才能同时实现这两个目标?

最佳答案

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

  • “真实”安装模式通过 python setup.py install 调用并将复制源代码,
  • “开发”模式通过 python setup.py develop 调用,并且只会创建指向源的符号链接(symbolic link)。

所以你必须重写 develop 命令,就像你已经使用 install 一样:

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
    <b>running custom develop command</b>
    running egg_info
...
Successfully installed spam
Cleaning up...

关于Python setuptools 符号链接(symbolic link)和自定义安装扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49326214/

相关文章:

python - 将 IP 列表解析为 python 中的 argparse 作为字符串

python - 创建并通过管道传输一个类似文件的对象作为命令的输入

python - 如何导出以包含所有依赖项的方式开发的 python 包,以便在另一台机器上进行离线安装?

python - Pandas :如何根据其他列值的条件对列求和?

python - 将数据拟合到后处理非线性模型时,curve_fit 的算法是什么?

python - 为什么我在安装时不断收到此消息说 EntryPoint must be in 'name=module :attrs [extras]

python - setuptools 测试隐藏导入错误。如何获得更好的信息?

java - GenJar 替换或更新?

python - 使用 python 应用程序打包 OpenCV

Python打包: catering to different audiences