如何汉化并编译 Python 源代码
前言
笔者是一名业余编程爱好者,年初偶然混进中文编程OO群。因觉得中文编程乃大势所趋,遂入了 Python 汉化(我称之为“草蟒”项目)的坑。笔者孤陋寡闻,刚开始汉化的时候只知道 GCC 且 GCC 不支持中文,所以没有选择汉化源代码的方式,而是采用替换式表层汉化方法(中文编写的程序,包括中文关键字和变量名等,先替换成英文,再交给解释器执行)。但近期从群里得知,Clang、VC 等编译器支持中文,这让我觉得从源代码入手进行汉化是完全可行的。
笔者在 Linux 和 Windows 系统下进行了实验汉化。Python 汉化大致可以分为两部分:关键字汉化和其他源代码汉化。
参考文章
[1]:为Python添加中文关键字
[2]:Python internals: adding a new statement to Python
[3]:Visual Studio error C2001:常量中有换行符(解决办法)
[4]:Changing CPython’s Grammar
[5]:Error C2001: Newline in constant when compiling
我的工具
- Windows 10 + Visual Studio 2019(须选装 python 开发支持)
- WSL Ubuntu + Clang
- 从 python 网站下载的 3.8.0 版源代码
关键字汉化
用 sublime 打开源代码 Gramma 目录中的 Grammar 文件并添加中文关键字,保存为 unicode 编码(下同)。示例如下:
if_stmt: ('if'|'如果') namedexpr_test ':' suite (('elif'|'不然') namedexpr_test ':' suite)* [('else'|'否则') ':' suite]
while_stmt: ('while'|'只要') namedexpr_test ':' suite [('else'|'另外') ':' suite]
for_stmt: ('for'|'取') exprlist ('in'|'于') testlist ':' [TYPE_COMMENT] suite [('else'|'另外') ':' suite]
......
with_stmt: ('with'|'管') with_item (',' with_item)* ':' [TYPE_COMMENT] suite
......
lambdef: ('lambda'|'雷锋') [varargslist] ':' test
......
注意:或许是 python 版本和所用编译器的不同,汉化关键字需要加单引号,这与参考文章[1]所述有所不同。
另外还要修改 Python/ast.c 文件。
其他源代码汉化
***必须支持英文版,所以不仅仅是汉化一些字符串,而是需要大量复制原来的代码并加以汉化。笔者汉化了两个函数以供演示效果,参见后面的图片。这是一个复杂的系统工程,欢迎感兴趣的读者联系我并加入汉化大业。
Linux 下编译
参见源代码目录下的 README.rst,cd 到源代码目录,然后执行以下命令:
./configure
make regen-grammar(重新生成 graminit.h 和 graminit.c)
make
make test(比较耗时,仅做实验的话这一步可省去)
sudo make install(这一步也可省略)
编译成功,运行 python 3.8.0,输入中文关键字和函数,正常执行。
Windows 下编译
Linux 平台下的轻松成功给了笔者很大的信心,随即转战 Windows 平台。之前只汉化了 while 等几个关键字,这次汉化了更多关键字,并打算用 Parser/pgen 这个 py 程序重新生成 graminit。结果让我大吃一惊,无论中文关键字加不加引号,或者用其他方式,都会报错。
转念一想,无论哪个平台,用的 graminit 文件都是一样的。何不在 linux 下生成汉化的 graminit 文件,然后在 windows 下使用呢?果然,这个办法是有效的。WSL 真心不错,否则要在两个平台之前切换还真麻烦。
开始编译。按照 PCBuild 下的 readme,在 Power Shell 中运行 build.bat。(第一次运行的话,会下载一些 externals,需要很长时间。)没执行一会,就显示一大堆红色警告:“error C2001: 常量中有换行符”。
问度娘,原来是 VS 的问题,奇数汉字不能正确解码,偶数汉字可以。网上给出的解决办法显然都不行。那么把 VS 的编译器换成 Clang 怎么样?结果还是显示同样的错误,而且还冒出其他错误。
难道我磕磕碰碰找到的新汉化方法又走不通?
不甘心,看看外网上的人怎么说。*搜索半天,终于找到解决办法:在 Visual Studio 里,给修改过的有汉字的文件的编译命令加上一条:/utf-8。
重新编译,生成解决方案,成功!
汉化效果演示
今天就分享到这里,有兴趣的同学请联系草蟒老吴。
欢迎转载!
上一篇: react路由懒加载 react-loadable 实现
下一篇: 求1-N之间所有的素数。
推荐阅读
-
如何汉化并编译 Python 源代码
-
linux 内核源码 编译_如何在现有Linux操作系统中从源代码编译和安装Linux内核
-
debian 源代码编译_如何在Debian 10上从源代码安装phpMyAdmin
-
如何编译PHP源代码介绍ZendEncode的安装方法我今天刚调试成功,不敢独享,拿来献宝_PHP教程
-
Python selenium如何打包静态网页并下载
-
vscode如何运行python? vs code新建并运行python代码的技巧
-
Ubuntu 12.04 64位 对Python 源代码编译详解
-
python中如何使用requests模块下载文件并获取进度提示?
-
如何利用python多线程爬取天气网站图片并保存
-
python-c - php的拓展如何编译一下给其他语言用?