python - setup.py 中的代码仅在构建期间被调用?还是在安装过程中?
问题描述
要构建包分发,我们使用以下命令调用 setup.py 文件:
python3 setup.py sdist,然后, setup.py 中的代码被调用并创建分发。
现在有两种安装方式:
pip install ./dist/SomeProject-1.0.4.tar.gz
点安装。
setup.py 文件是否在安装过程中同时使用上述两种方法被调用?(我在 setup.py 文件中添加了打印语句,并注意到它在构建期间显示但在安装期间不显示)
但是文档说“设置脚本通常非常简单,尽管因为它是用 Python 编写的,所以你可以用它做的事情没有任意限制,尽管你应该小心在设置脚本中放置任意昂贵的操作。不像,比如说,Autoconf 风格的配置脚本,设置脚本可能会在构建和安装模块分发的过程中运行多次。 ” https://docs.python.org/3/distutils/introduction.html#a-simple-例子
我只想在构建期间而不是在安装期间在 setup.py 文件中运行一些自定义代码。这可能吗?
解决方案
setup.py 中的代码仅在构建期间被调用?还是在安装过程中?
这取决于...
如果您使用setuptools安装项目(setup.py install
或easy_install
),那么您setup.py
很可能在安装时运行。如果您使用pip安装它,那么您setup.py
很可能不会在安装时运行。
您应该将自定义步骤限制为您可以控制的构建操作。一旦您发布了项目的发行版,您几乎无法控制到底发生了什么。
我只想在构建期间而不是在安装期间在 setup.py 文件中运行一些自定义代码。这可能吗?
是的。您需要自定义相应的命令。
下面是一个示例,展示了如何创建一个新的自定义build_something
命令,该命令也作为默认build
命令的子命令添加:
#!/usr/bin/env python3
import distutils.command.build
import setuptools
class build_something(setuptools.Command):
user_options = []
def initialize_options(self):
pass
def finalize_options(self):
pass
def run(self):
print(" *** build_something ***")
class build(distutils.command.build.build):
_sub_command = (
'build_something',
None,
)
_sub_commands = distutils.command.build.build.sub_commands
sub_commands = [_sub_command] + _sub_commands
setuptools.setup(
name='Thing',
version='0.0.0',
cmdclass={
'build_something': build_something,
'build': build,
},
)
推荐阅读
- node.js - 使用 nvm 更新节点的系统版本
- c# - C#.net winforms:无法将验证码存储到图片框中
- macos - OS X 下的 GLX 手册页
- dart - 由脚手架 floatingActionButton 更新的小部件状态
- sql - 如何优化我的查询?
- html - 无法使用 301 和 .htacces 重定向
- ajax - 由于设置了自定义标头,ajax http 自动更改为 http 帖子
- ssl - 从 .cer 和 pfx 的密码生成 pfx
- ios - UICollectionViewController 未注册创建的自定义单元类
- python - 如何在 python-docx 中同时应用粗体和居中?