日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

如何汉化并编译 Python 源代码

發布時間:2023/12/10 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何汉化并编译 Python 源代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何漢化并編譯 Python 源代碼

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

前言

筆者是一名業余編程愛好者,年初偶然混進中文編程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 到源代碼目錄,然后執行以下命令:

    ./configuremake regen-grammar(重新生成 graminit.h 和 graminit.c)makemake 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。
    重新編譯,生成解決方案,成功!

    漢化效果演示




    今天就分享到這里,有興趣的同學請聯系草蟒老吳。
    歡迎轉載!

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。