gpt4 book ai didi

python - 使用 SCons 作为 distutils 的构建引擎

转载 作者:太空狗 更新时间:2023-10-29 21:55:52 24 4
gpt4 key购买 nike

我有一个 python 包,其中包含构建扩展所需的一些 C 代码(具有一些重要的构建需求)。我使用 SCons 作为我的构建系统,因为它非常好而且灵活。

我正在寻找一种方法来使用 SCons 编译我的 python 扩展,准备好与 distutils 一起分发。我希望用户只需键入 setup.py install 并使用 SCons 而不是默认的 distutils 构建引擎编译扩展。

想到的一个想法是在 distutils 中重新定义 build_ext 命令,但我找不到它的大量文档。

有什么建议吗?

最佳答案

enscons package似乎是为了做所问的问题而设计的。 here 是使用它构建带有 C 扩展的包的示例。 .

你可以有一个基本的包结构,比如:

pkgroot/
pyproject.toml
setup.py
SConstruct
README.md
pkgname/
__init__.py
pkgname.py
cfile.c

在这个 pyproject.toml 文件中可能看起来像这样:

[build-system]
requires = ["enscons"]

[tool.enscons]
name = "pkgname"
description = "My nice packahe"
version = "0.0.1"
author = "Me"
author_email = "me@me.com"
keywords = ["spam"]
url = "https://github.com/me/pkgname"
src_root = ""
packages = ["pkgname"]

[tool.enscons] 部分包含许多 setuptools/distutils setup 函数熟悉的内容。从 here 复制,setup.py 函数可能包含如下内容:

#!/usr/bin/env python

# Call enscons to emulate setup.py, installing if necessary.

import sys, subprocess, os.path

sys.path[0:0] = ['setup-requires']

try:
import enscons.setup
except ImportError:
requires = ["enscons"]
subprocess.check_call([sys.executable, "-m", "pip", "install",
"-t", "setup-requires"] + requires)
del sys.path_importer_cache['setup-requires'] # needed if setup-requires was absent
import enscons.setup

enscons.setup.setup()

最后,SConstruct 文件可能类似于:

# Build pkgname

import sys, os
import pytoml as toml
import enscons, enscons.cpyext

metadata = dict(toml.load(open('pyproject.toml')))['tool']['enscons']

# most specific binary, non-manylinux1 tag should be at the top of this list
import wheel.pep425tags
full_tag = next(tag for tag in wheel.pep425tags.get_supported() if not 'manylinux' in tag)

env = Environment(tools=['default', 'packaging', enscons.generate, enscons.cpyext.generate],
PACKAGE_METADATA=metadata,
WHEEL_TAG=full_tag)

ext_filename = os.path.join('pkgname', 'libcfile')

extension = env.SharedLibrary(target=ext_filename,
source=['pkgname/cfile.c'])

py_source = Glob('pkgname/*.py')

platlib = env.Whl('platlib', py_source + extension, root='')
whl = env.WhlFile(source=platlib)

# Add automatic source files, plus any other needed files.
sdist_source=list(set(FindSourceFiles() +
['PKG-INFO', 'setup.py'] +
Glob('pkgname/*', exclude=['pkgname/*.os'])))

sdist = env.SDist(source=sdist_source)
env.Alias('sdist', sdist)

install = env.Command("#DUMMY", whl,
' '.join([sys.executable, '-m', 'pip', 'install', '--no-deps', '$SOURCE']))
env.Alias('install', install)
env.AlwaysBuild(install)

env.Default(whl, sdist)

在此之后你应该能够运行

sudo python setup.py install

编译C扩展并造轮子,安装python包,或者

python setup.py sdist

构建源代码分发。

不过,我认为您基本上可以在 SConstruct 文件中使用 SCons 做任何事情。

关于python - 使用 SCons 作为 distutils 的构建引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2627731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com