Python setuptools 符号链接和自定义安装扩展
Python setuptools symlinks and custom install extension
我想为我的 python 包实现以下两个功能,该包具有 setup.py 并使用设置工具:
- 允许使用符号链接安装而不是复制包
文件
- 当 "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)
但是,我发现:
- 如果我运行 pip 如上,自定义代码永远不会被调用
自定义代码 运行 如果我这样做:
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
...
成功安装垃圾邮件
打扫干净...
我想为我的 python 包实现以下两个功能,该包具有 setup.py 并使用设置工具:
- 允许使用符号链接安装而不是复制包 文件
- 当 "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)
但是,我发现:
- 如果我运行 pip 如上,自定义代码永远不会被调用
自定义代码 运行 如果我这样做:
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
...
成功安装垃圾邮件
打扫干净...