我想为具有 setup.py 并使用 setuptools 的 python 包实现以下两项:
- 允许使用符号链接(symbolic link)安装而不是复制包 文件
- 允许自定义代码在与“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)
但是,我发现:
- 如果我像上面那样运行 pip,自定义代码永远不会被调用
如果我这样做,自定义代码会运行:
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/