- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL;DR 如何让 distutils/setuptools 正确包含非纯数据文件?
我有一个项目使用自定义工具链生成一些重要的代码,然后使用 SWIG 包装生成的代码,最后构建 Python 扩展。 Cmake 出色地封装了所有这些,最后我在项目的根目录中有一个文件夹,它的工作方式与任何其他 Python 包完全一样。
我想要一个简单的setup.py
,这样我就可以将这个包打包成一个轮子并将其发送到 PyPI,这样普通的 Python 用户就不必处理构建过程。 SO 上有很多关于如何强制设置工具生成非纯轮子的答案,然后您可以使用 package_data
字段或 MANIFEST.in
捆绑扩展> 文件。
问题是此方法会导致轮子格式错误,因为扩展包含在 purelib
下而不是根目录下(它们属于 Root-Is-Pure: False
轮)。一些工具和发行版依赖于这种正确的分离。
我不感兴趣的答案:从 setup.py
中运行 cmake 的自定义扩展(不想为配置项目添加另一层间接层,不想维护它在构建选项更改时),修改生成的轮子,我宁愿避免向项目根目录添加任何文件,而不仅仅是 setup.py
最佳答案
这行得通。 distutils
和 setuptools
一定是现存的中央 Python 基础设施中设计最差的部分。
from setuptools import setup, find_packages, Extension
from setuptools.command.build_ext import build_ext
import os
import pathlib
import shutil
suffix = '.pyd' if os.name == 'nt' else '.so'
class CustomDistribution(Distribution):
def iter_distribution_names(self):
for pkg in self.packages or ():
yield pkg
for module in self.py_modules or ():
yield module
class CustomExtension(Extension):
def __init__(self, path):
self.path = path
super().__init__(pathlib.PurePath(path).name, [])
class build_CustomExtensions(build_ext):
def run(self):
for ext in (x for x in self.extensions if isinstance(x, CustomExtension)):
source = f"{ext.path}{suffix}"
build_dir = pathlib.PurePath(self.get_ext_fullpath(ext.name)).parent
os.makedirs(f"{build_dir}/{pathlib.PurePath(ext.path).parent}",
exist_ok = True)
shutil.copy(f"{source}", f"{build_dir}/{source}")
def find_extensions(directory):
extensions = []
for path, _, filenames in os.walk(directory):
for filename in filenames:
filename = pathlib.PurePath(filename)
if pathlib.PurePath(filename).suffix == suffix:
extensions.append(CustomExtension(os.path.join(path, filename.stem)))
return extensions
setup(
# Stuff
ext_modules = find_extensions("PackageRoot"),
cmdclass = {'build_ext': build_CustomExtensions}
distclass = CustomDistribution
)
我正在将扩展复制到构建目录中,仅此而已。我们覆盖了分布以欺骗 egg-info 作者关于有任何扩展,一切都是肉汁。
关于python - 将预编译的扩展放在非纯 Python Wheel 包的根文件夹中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63350376/
任何 Web、桌面或移动开发人员都经常使用图像。你可以从 C#、HTML、XAML、CSS、C++、VB、TypeScript 甚至代码注释中引用它们。有些图像是本地的,有些存在于线上或网络共享中
您是否曾经难以理解一个提交在做什么或者为什么要做?在审查或协作代码更改时,您是否希望有更多的清晰度和上下文?如果您的回答是肯定的,那么您会喜欢 GitHub Copilot 为您所做的——生成提交
Visual Studio 订阅(无论是专业版还是企业版)提供的不仅仅是软件使用权;这是一个全面的工具包,旨在显著提高您的开发能力和职业发展。这些订阅每年可以为您节省数千美元,提供各种服务,从每月
随着最近 Visual Studio 的资源管理器的改进,开发人员将得到一种全新的享受!我们非常激动地宣布重新设计的 Visual Studio 资源管理器,相信我们,它将改变游戏规则。 在
委托在现代代码中无处不在;委托是一种类型,它表示对具有特定参数列表和返回类型的方法的引用。开发人员使用委托将方法作为参数传递给其他方法。您可能熟悉的一个例子是事件处理程序。处理程序是可以通过委托调
来自Sergey Tepliakov的 https://sergeyteplyakov.github.io/Blog/csharp/2024/06/14/Custom_Task_Schedule
GitHub Copilot 是一个改变游戏规则的人工智能助手,可以彻底改变您在 Visual Studio 中的编码流程。在我们的视频系列中,Bruno Capuano 探讨了这个智
在17.10预览版2中,我们刚刚发布了预览支持,可以直接在 Visual Studio 的工作文件中查看 GitHub 和 Azure DevOps 的拉取请求注释。作为开发者社区中最受欢迎的 G
MSBuild 是 .NET 开发体验的基本组成部分,但它对新手和有经验的开发人员都具有挑战性。为了帮助开发人员更好地理解他们的项目文件,并访问需要直接编辑项目文件的高级功能,我们发布了一个实验性
通过使用代码覆盖率功能,您可以发现您的测试需要改进的地方,并使您的软件更加健壮和可靠。在这篇文章中,我们将介绍我们在 Visual Studio Enterprise 2022 中引入的 Code
GitHub Copilot 简介 GitHub Copilot 是一个新工具,可以帮助您在人工智能的帮助下更快,更智能地编写代码。它可以建议代码补全,生成代码片段,甚至为您编写整个函数。Git
序:最近看了一篇谷歌工程师总结自己十年来所学到的软技能,感觉说的很棒,特地翻译成中文,希望能分享给更多的人,原文内容非常多,计划分几篇翻译出来,个人的水平有限,感兴趣的朋友也可以进去看英文原文。原文地
本文为翻译 。 原文地址: 2023 State of Web Components: Today's standards and a glimpse into the future. 。
任何 Web、桌面或移动开发人员都经常使用图像。你可以从 C#、HTML、XAML、CSS、C++、TypeScript 甚至代码注释中引用它们。有些图像是本地的,有些存在于线上或网络共享中,而其
在 Visual Studio 2022 中,Web 开发人员的主要场景之一是使用 ASP.NET Core 创建 Web API。在 Visual Studio 2022 17.6 的最新预览
.NET 在数年前就在语言和库中添加了 async/await。在那段时间里,它像野火一样蔓延开来,不仅在 .NET 生态系统中,而且在无数其他语言和框架中被复制。在 .NET 中也看到了大量的
原文 | Stephen Toub 翻译 | 郑子铭 Mono 到目前为止,我一直提到 "JIT"、"GC "和 "运行时&quo
原文 | Stephen Toub 翻译 | 郑子铭 原始类型和数值 (Primitive Types and Numerics) 我们已经看过了代码生成和GC,线程和矢量化,互操
原文 | Stephen Toub 翻译 | 郑子铭 同样,为了不做不必要的工作,有一个相当常见的模式出现在string.Substring和span.Slice等方法中。
原文 | Stephen Toub 翻译 | 郑子铭 New APIs 在.NET 7中,Regex得到了几个新的方法,所有这些方法都能提高性能。新的API的简单性可能也误导了为实
我是一名优秀的程序员,十分优秀!