日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

如何汉化并编译 Python 源代码

發(fā)布時(shí)間:2023/12/10 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何汉化并编译 Python 源代码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如何漢化并編譯 Python 源代碼

  • 前言
    • 參考文章
    • 我的工具
    • 關(guān)鍵字漢化
    • 其他源代碼漢化
    • Linux 下編譯
    • Windows 下編譯
    • 漢化效果演示

前言

筆者是一名業(yè)余編程愛(ài)好者,年初偶然混進(jìn)中文編程OO群。因覺(jué)得中文編程乃大勢(shì)所趨,遂入了 Python 漢化(我稱之為“草蟒”項(xiàng)目)的坑。筆者孤陋寡聞,剛開(kāi)始漢化的時(shí)候只知道 GCC 且 GCC 不支持中文,所以沒(méi)有選擇漢化源代碼的方式,而是采用替換式表層漢化方法(中文編寫的程序,包括中文關(guān)鍵字和變量名等,先替換成英文,再交給解釋器執(zhí)行)。但近期從群里得知,Clang、VC 等編譯器支持中文,這讓我覺(jué)得從源代碼入手進(jìn)行漢化是完全可行的。
筆者在 Linux 和 Windows 系統(tǒng)下進(jìn)行了實(shí)驗(yàn)漢化。Python 漢化大致可以分為兩部分:關(guān)鍵字漢化和其他源代碼漢化。

參考文章

[1]:為Python添加中文關(guān)鍵字
[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 開(kāi)發(fā)支持)
  • WSL Ubuntu + Clang
  • 從 python 網(wǎng)站下載的 3.8.0 版源代碼
  • 關(guān)鍵字漢化

    用 sublime 打開(kāi)源代碼 Gramma 目錄中的 Grammar 文件并添加中文關(guān)鍵字,保存為 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 版本和所用編譯器的不同,漢化關(guān)鍵字需要加單引號(hào),這與參考文章[1]所述有所不同。
    另外還要修改 Python/ast.c 文件。

    其他源代碼漢化

    漢化版必須支持英文版,所以不僅僅是漢化一些字符串,而是需要大量復(fù)制原來(lái)的代碼并加以漢化。筆者漢化了兩個(gè)函數(shù)以供演示效果,參見(jiàn)后面的圖片。這是一個(gè)復(fù)雜的系統(tǒng)工程,歡迎感興趣的讀者聯(lián)系我并加入漢化大業(yè)。

    Linux 下編譯

    參見(jiàn)源代碼目錄下的 README.rst,cd 到源代碼目錄,然后執(zhí)行以下命令:

    ./configuremake regen-grammar(重新生成 graminit.h 和 graminit.c)makemake test(比較耗時(shí),僅做實(shí)驗(yàn)的話這一步可省去)sudo make install(這一步也可省略)

    編譯成功,運(yùn)行 python 3.8.0,輸入中文關(guān)鍵字和函數(shù),正常執(zhí)行。

    Windows 下編譯

    Linux 平臺(tái)下的輕松成功給了筆者很大的信心,隨即轉(zhuǎn)戰(zhàn) Windows 平臺(tái)。之前只漢化了 while 等幾個(gè)關(guān)鍵字,這次漢化了更多關(guān)鍵字,并打算用 Parser/pgen 這個(gè) py 程序重新生成 graminit。結(jié)果讓我大吃一驚,無(wú)論中文關(guān)鍵字加不加引號(hào),或者用其他方式,都會(huì)報(bào)錯(cuò)。
    轉(zhuǎn)念一想,無(wú)論哪個(gè)平臺(tái),用的 graminit 文件都是一樣的。何不在 linux 下生成漢化的 graminit 文件,然后在 windows 下使用呢?果然,這個(gè)辦法是有效的。WSL 真心不錯(cuò),否則要在兩個(gè)平臺(tái)之前切換還真麻煩。
    開(kāi)始編譯。按照 PCBuild 下的 readme,在 Power Shell 中運(yùn)行 build.bat。(第一次運(yùn)行的話,會(huì)下載一些 externals,需要很長(zhǎng)時(shí)間。)沒(méi)執(zhí)行一會(huì),就顯示一大堆紅色警告:“error C2001: 常量中有換行符”。
    問(wèn)度娘,原來(lái)是 VS 的問(wèn)題,奇數(shù)漢字不能正確解碼,偶數(shù)漢字可以。網(wǎng)上給出的解決辦法顯然都不行。那么把 VS 的編譯器換成 Clang 怎么樣?結(jié)果還是顯示同樣的錯(cuò)誤,而且還冒出其他錯(cuò)誤。
    難道我磕磕碰碰找到的新漢化方法又走不通?
    不甘心,看看外網(wǎng)上的人怎么說(shuō)。翻墻搜索半天,終于找到解決辦法:在 Visual Studio 里,給修改過(guò)的有漢字的文件的編譯命令加上一條:/utf-8。
    重新編譯,生成解決方案,成功!

    漢化效果演示




    今天就分享到這里,有興趣的同學(xué)請(qǐng)聯(lián)系草蟒老吳。
    歡迎轉(zhuǎn)載!

    總結(jié)

    以上是生活随笔為你收集整理的如何汉化并编译 Python 源代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。