- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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/
这似乎是一个常见问题,但没有一个答案似乎有帮助。在 Windows 10 中安装 statsmodels 时弹出错误(已安装 python 3.6.2): python setup.py instal
Python 在可用于打包和描述项目的工具方面有着令人困惑的历史:这些工具包括标准库中的 distutils、distribute、distutils2 和 setuptools(可能还有更多)。 d
D:\anzhuang\anconda\lib\distutils\__init__.py:14: UserWarning: The virtualenv distutils package at %
I was trying to have a virtualenv set up where it is at python 3.8 while my system is at a more r
我正在尝试通过安装 nose 并输入 来测试我的 scipy 安装 import scipy scipy.test('1','10') 我遇到了大约 200 个错误,但最常见的错误之一是: ....
我使用sudo apt-get install python3-pip安装了pip3之后,当我运行以下命令来安装Django sudo pip3 install django时,出现此错误: Trac
为什么这会创建 2 个 tar.gz 文件,‘python setup.py sdist ?我正在尝试使用上传twine upload -r pypitest dist/*.tar.gz我得到错误说
在某些情况下,由于pypi服务器已经上传了保存版本,因此我想使python setup.py upload失败时自动执行上传过程中的错误。 如何强制其从脚本上传(我知道我可以使用网络界面删除旧版本)。
我正在linux中编译一些cython扩展,并注意到从distutils机制进行构建时,它默认使用-O2。我想知道是否有一种简单的方法可以将其更改为-O3。 我尝试在Extension对象上使用ext
我继承了 Fortran 77 代码,该代码实现了多个子例程,这些子例程通过程序 block 运行,每次运行程序时都需要通过交互式命令提示符进行大量用户输入。由于我想自动运行代码,因此我将所有子例程移
我有一个简单的纯 python 项目,我想将其与 distutils 一起使用。我已成功为 python 模块和一些许可证文本文件创建压缩 tar 文件。这些是 setup.py 的相关部分setup
我一直在开发一个包含大量文件的 Python 扩展模块。在一台机器上构建时,python setup.py build 会很高兴地检测更改的文件,仅构建这些文件,并将整个文件链接在一起,就像 make
所以可以使用distutils创建文件,比如 PIL-1.1.6.win32-py2.5.exe 您可以运行并使用它来轻松安装某些东西。但是,安装需要用户输入才能继续(您必须单击“确定”三次)。我想创
我已经用 C 编写了一个 Python 扩展库,目前我正在使用 distutils 来构建它。我还有一个生成 .h 文件的 Python 脚本,我想将其包含在我的扩展中。 是否可以使用 distuti
我找到了Question#1321270用于安装后。我目前的主要目标是 bdist_wininst,但我没有找到任何与卸载相关的内容... 澄清一下: 我想在安装后注册一个com服务器并在卸载前取消注
是否可以让 distutils 只运行 python 模块依赖性分析(并可能安装丢失的模块)而不实际安装有问题的 python 模块?我想象一个命令如下: ./setup.py check-depen
我已阅读文档,但我不明白。 为什么我必须使用 distutils 来安装 python 模块? 为什么我不能将模块保存在 python 路径中? 最佳答案 您不必使用 distutils。您可以手动安
我写了一个 boost-python 扩展,目前正在通过 distutils 构建。 不幸的是,我无法在 distutils 中找到一种方法来构建没有调试符号的扩展,或者在安装时从扩展中删除符号。 注
也许是个愚蠢的问题,但我想知道 Python 的 distutils 从哪里获得编译器选项?它得到了一些链接目录错误,我想一劳永逸地纠正它。 我知道应该有一个 prefix/lib/pythonver
例如,我可以使用 python setup.py build --compiler=msvc 或 python setup.py build --compiler=mingw32 或只是 python
我是一名优秀的程序员,十分优秀!