python3如何使用,Python3 教程
最近一直在摆弄Python,想让别人学会用自己的SolidMCP等制作计算机编程语言解释器。
当初觉得很高级,就这样分离了某开源软件的基于夸脱的计算机编程语言控制台安装,成功移植到了SolidMCP内。
在这个过程中,我发现其实写一个蹩脚的计算机编程语言解释器并不是很难100 .票哥决定冷静下来,进行研究。然后,将研究成果记录如下。
如何写计算机编程语言解释器
先用计算机编程语言写原型,然后用c翻译就可以了。
importsysimportosimportcode
重定向输出=r c:\ redirectedpythonconsole。文本
#重定向信道
class my console 3360 de f write(自我,输入):
myfile=file(重定向输出, a )。
output=\nPython 输入
myFile.write(输出)
我的档案。关闭(# redirectstdouttomyconsole
defaultStdOut=sys.stdout
myConsole=MyConsole()
sys。stdout=myconsoleifos。路径。存在(重定向输出) :
OS。remove(redirectedoutput)compileinputcodetocodeobject #运行代码对象
输入代码= 23 解释器=代码.交互解释器(
代码对象=interpreter.com pile(输入代码)
解释器。运行代码(代码对象) )。
sys.stdout=myConsole
版本c的原型
//演示演示交互式解释交互式控制台
voidtestInterpreter(
{
py _ Initialize(;//# loadcodemoduletouse interactiveinterpreterandinteractiveconsole//# utilities usetemulatepython interactiveinterprese interactiveconsolecloselyemultimesthehavior interactivepython interphon
巴拉圭对象*模块=py导入_导入模块(代码);//constructioninteractiveinterferfromcodemodule
py object * func=py object _ getattrstring(模块,交互式解释器);
Py object * args=Py _ build value()()));
py对象*解释器=py eval _ call对象(func,args);//以代码形式提供输入
const char * source= 2 3
py对象* source args=py _ build值(()),source);
py object * compile func=py object _ getattrstring(解释器,编译);
py object * code object=py eval _ call object(compile func,source args);//运行编译的字节码
py对象*主模块=py导入_添加模块(_ _ main _ );
巴拉圭对象*字典=py模块_获取字典(主模式);
py object * presult=py eval _ eval code()pycodeObject *)code object,dict,dict);//最后,releaseverythingbydecremedingheirreferencecounts .//py _ de cref(主模块);
py _ decref(presult;
py _ decref(DICT;
py _ de cref(代码对象;
py _ decref(编译函数;
py _ decref(源参数;
py _ de cref(企业;
py _ decref(Args;
py _ decref(func;
py _ Finalize(;
}
基本原理就是这样,剩下的事情就是重定向sys.stdout,然后处理文本编辑控件的事件。
利用交互控制台直接用计算机编程语言书写
计算机编程语言提供了交互式控制台来帮我做这件事。这其实也是从交互式解释程序继承的。
那些基于PyQt的大蟒控制台一般都是这样做的。
请参见- -
#从activestatecoderecipes复制
# http://代码。活动状态。com/recipes/355319-using-codeinteractiveconsole-to-embed-a-python-she/
请参见- -
importsysimportcodefromcodeimportinteractiveconsoleclassfilecacher: cachethestuduttextsowcanalyzeitbeforerectingit
def _ _ init _ _(self)3360 self。reset(defreset)self):self。out=[]de fwrite(self,line ) 3360 self
输出=\n .加入(自我退出).
自复位(交互式类外壳): wrapperaroundpython tatcanfilterinput/outputtheshellet
def __init__(self):
self.stdout=sys.stdout
自我。cache=文件缓存er(
交互式控制台. init _ _ (self ) return
efget_output(self):
sys。stdout=self。cachedefreturn _ output(self):
sys。stdout=self。stdoutdefpush(self,line):
自我。get _ output(# youcanfilterinputherebydoingsominglike
#行=过滤器(线) )
interactiveconsole.push(self,line))。
self.return_output()
输出=自我。缓存。flush(# youcanfiltertheoutputherebydoingsominglike
#输出=过滤器(输出)
打印输出#订单优先级
返回
if __name__==__main__ :
sh=壳() )
先令交互(
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。