如何在python环境中而不是从命令行使用Fonttools的pyftsubset

如何在python环境中而不是从命令行使用Fonttools的pyftsubset,python,fonts,ttx-fonttools,Python,Fonts,Ttx Fonttools,我需要对很多字体文件进行子集,我需要在python环境中完成这项工作。然而,Fonttools的文档非常缺乏,我无法在python中找到基于unicode执行子集设置的模块和正确的函数语法,而不是作为命令行工具(pyftsubset)。我的一些文件在Fonttools读取时包含各种错误,我无法使用捕获异常!jupyter内部的command。pyftsubset本身只是一个Python脚本,它调用fontTools.subset.main,然后解析sys.argv(命令行args)以执行子集设置

我需要对很多字体文件进行子集,我需要在python环境中完成这项工作。然而,Fonttools的文档非常缺乏,我无法在python中找到基于unicode执行子集设置的模块和正确的函数语法,而不是作为命令行工具(
pyftsubset
)。我的一些文件在Fonttools读取时包含各种错误,我无法使用
捕获异常!jupyter内部的command

pyftsubset
本身只是一个Python脚本,它调用
fontTools.subset.main
,然后解析
sys.argv
(命令行args)以执行子集设置。您可以在自己的脚本中轻松完成相同的操作,例如:

import sys
from fontTools.subset import main as ss

sys.argv = [None, '/path/to/font/file.ttf', '--unicodes=U+0020-002F']
ss()  # this is what actually does the subsetting and writes the output file

显然,您希望为
--unicodes
以及许多其他
pyftsubset
选项使用您自己的值,但通常情况下,此方案应该有效。可能的警告是,如果程序的其他部分使用/依赖于
sys.argv
;如果是这种情况,您可能希望在修改sys.argv并调用子服务器之前捕获另一个变量中的初始值,然后将其重新设置为之后的初始值。

pyftsubset
本身只是一个Python脚本,它调用
fontTools.subset.main
,然后解析
sys.argv
(命令行参数)执行子集设置。您可以在自己的脚本中非常轻松地执行相同的操作,例如:

import sys
from fontTools.subset import main as ss

sys.argv = [None, '/path/to/font/file.ttf', '--unicodes=U+0020-002F']
ss()  # this is what actually does the subsetting and writes the output file

显然,您需要为
--unicodes
使用您自己的值,以及许多其他
pyftsubset
选项,但一般来说,此方案应该有效。可能需要注意的是,如果您的程序中有其他部分使用/依赖
sys.argv
;如果是这种情况,您可能希望在另一个va中捕获初始值在修改
sys.argv
并调用子服务器之前,请执行riable,然后将其重新设置为之后的初始值。

我认为这应该是正确执行此操作的一种python方法:

from fontTools import subset
subsetter = subset.Subsetter()
subsetter.populate(unicodes=["U+0020", "U+0021"])
subsetter.subset(font)
font
是您的TTFont,您可能需要查看文档以了解如何准确地传递Unicode列表。我没有测试这段准确的代码,但我使用
subsetter.populate对其进行了测试(glyphs=[“a”,“b”])
它执行类似的任务,但使用glyphNames代替。
populate
方法可以将这些参数作为文档:
populate(self,glyphs=[],gids=[],unicodes=[],text='')


我在中找到了一个线索。

我认为这应该是一种正确的方法:

from fontTools import subset
subsetter = subset.Subsetter()
subsetter.populate(unicodes=["U+0020", "U+0021"])
subsetter.subset(font)
font
是您的TTFont,您可能需要查看文档以了解如何准确地传递Unicode列表。我没有测试这段准确的代码,但我使用
subsetter.populate对其进行了测试(glyphs=[“a”,“b”])
它执行类似的任务,但使用glyphNames代替。
populate
方法可以将这些参数作为文档:
populate(self,glyphs=[],gids=[],unicodes=[],text='')


我在中找到了一个线索。

谢谢你的解决方案。是否可以更优雅地运行它,即访问实际执行子集设置的函数?我检查了源代码和子集模块的
\uu main\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu.py
以某种方式引用了自身。这里,
from\uuuuuuuuuuuuuuuuuuuuuuuuuuuu future\uuuuuuuuuuuuuuuurt from fontTools.misc.py23 import*导入sys from fontTools.subset import main如果_uname_uu='__umain_uuu':sys.exit(main())
方法是创建您自己的
fontTools.subset.subset
对象,并用您想要的值填充它,然后调用该对象的
subset()
方法在您创建的
fontTools.ttLib.TTFont
对象上执行…无论如何,对我来说,所有这些都不如简单地使用文档化的命令行选项设置
sys.argv
,然后调用
fontTools.subset.main()
带有字体路径。感谢您的解决方案。是否可以更优雅地运行它,即访问实际进行子集设置的函数?我检查了源代码和子集模块的
\uuuu main\uuuuuuuupy
以某种方式引用了自身。这里,
from\uuuu future\uuuuuuuuuu导入打印函数,除法,从f导入绝对值ontTools.misc.py23 import*import sys from fontTools.subset import main如果_uname_uu='_u main_uuu':sys.exit(main())
方法是创建您自己的
fontTools.subset.subset
对象,并用您想要的值填充它,然后调用该对象的
subset()
方法在您创建的
fontTools.ttLib.TTFont
对象上执行…无论如何,对我来说,所有这些都不如简单地使用文档化的命令行选项设置
sys.argv
,然后使用字体路径调用
fontTools.subset.main()