当前位置:首页 » 编程软件 » python利器的编译怎么用

python利器的编译怎么用

发布时间: 2023-12-12 01:07:16

python怎样使用解释器

大学里计算机科学最吸引我的地方就是编译器。最神奇的是,编译器是如何读出我写的那些烂代码,并且还能生成那么复杂的程序。当我终于选了一门编译方面的课程时,我发现这个过程比我想的要简单得多。

在本系列的文章中,我会试着通过为一种基本命令语言IMP写一个解释器,来展示这种简易性。因为IMP是一个简单广为人知的语言,所以打算用 Python写这个解释器。Python代码看起来很像伪代码,所以即使你不认识 Python,你也能理解它。解析可以通过一套从头开始实现的解析器组合完成(在本系列的下一篇文章中会有解释)。除了sys(用于I/O)、re(用于解析正则表达式)以及unittest(用于确保一切工作正常)库,没有使用其他额外的库。

IMP 语言

在开始写之前,我们先来讨论一下将要解释的语言。IMP是拥有下面结构的最小命令语言:

赋值语句(所有变量都是全局的,而且只能存储整数):

Python

1

x := 1

条件语句:

Python

1

2

3

4

5

if x = 1 then

y := 2

else

y := 3

end

while循环:

Python

1

2

3

while x < 10 do

x := x + 1

end

复合语句(分号分隔):

Python

1

2

x := 1;

y := 2

OK,所以它只是一门工具语言,但你可以很容易就把它扩展成比Lua或python更有用的语言。我希望能把这份教程能保持尽量简单。

下面这个例子是计算阶乘的程序:

Python

1

2

3

4

5

6

n := 5;

p := 1;

while n > 0 do

p := p * n;

n := n - 1

end

IMP没有读取输入的方式,所以初始状态必须是在程序最开始写一系列的赋值语句。也没有打印结果的方式,所以解释器必须在程序的结尾打印所有变量的值。

解释器的结构

解释器的核心是“中间表示”(Intermediate representation,IR)。这就是如何在内存中表示IMP程序。因为IMP是一个很简单的语言,中间表示将直接对应于语言的语法;每一种表达和语句都有对应的类。在一种更复杂的语言中,你不仅需要一个“语法表示”,还需要一个更容易分析或运行的“语义表示”。

解释器将会执行三个阶段:

  • 源码中的字符分割成标记符(token)

  • 将标记符组织成一棵抽象语法树(AST)。抽象语法树就是中间表示。

  • 评估这棵抽象语法树,并在最后打印这棵树的状态

  • 将字符串分割成标记符的过程叫做“词法分析”,通过一个词法分析器完成。关键字是很短,易于理解的字符串,包含程序中最基本的部分,如数字、标识符、关键字和操作符。词法分析器会除去空格和注释,因为它们都会被解释器忽略。

    实际执行这个解析过的抽象语法树的过程称为评估。这实际上是这个解析器中最简单的部分了。

    本文会把重点放在词法分析器上。我们将编写一个通用的词汇库,然后用它来为IMP创建一个词法分析器。下一篇文章将会重点打造一个语法分析器和评估计算器。

    词汇库

    词法分析器的操作相当简单。它是基于正则表达式的,所以如果你不熟悉它们,你可能需要读一些资料。简单来说,正则表达式就是一种能描述其他字符串的特殊的格式化的字符串。你可以使用它们去匹配电话号码或是邮箱地址,或者是像我们遇到在这种情况,不同类型的标记符。

    词法分析器的输入可能只是一个字符串。简单起见,我们将整个输入文件都读到内存中。输出是一个标记符列表。每个标记符包括一个值(它代表的字符串)和一个标记(表示它是一个什么类型的标记符)。语法分析器会使用这两个数据来决定如何构建一棵抽象语法树。

    由于不论何种语言的词法分析器,其操作都大同小异,我们将创建一个通用的词法分析器,包括一个正则表达式列表和对应的标签(tag)。对每一个表达式,它都会检查是否和当前位置的输入文本匹配。如果匹配,匹配文本就会作为一个标记符被提取出来,并且被加上该正则表达式的标签。如果该正则表达式没有标签,那么这段文本将会被丢弃。这样免得我们被诸如注释和空格之类的垃圾字符干扰。如果没有匹配的正则表达式,程序就要报错并终止。这个过程会不断循环直到没有字符可匹配。

    下面是一段来自词汇库的代码:

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

  • import sys

    import re

    def lex(characters, token_exprs):

    pos = 0

    tokens = []

    while pos < len(characters):

    match = None

    for token_expr in token_exprs:

    pattern, tag = token_expr

    regex = re.compile(pattern)

    match = regex.match(characters, pos)

    if match:

    text = match.group(0)

    if tag:

    token = (text, tag)

    tokens.append(token)

    break

    if not match:

    sys.stderr.write('Illegal character: %sn' % characters[pos])

    sys.exit(1)

    else:

    pos = match.end(0)

    return tokens

  • 注意,我们遍历正则表达式的顺序很重要。lex会遍历所有的表达式,然后接受第一个匹配成功的表达式。这也就意味着,当使用词法分析器时,我们应当首先考虑最具体的表达式(像那些匹配算子(matching operator)和关键词),其次才是比较一般的表达式(像标识符和数字)。

    词法分析器

    给定上面的lex函数,为IMP定义一个词法分析器就非常简单了。首先我们要做的就是为标记符定义一系列的标签。IMP只需要三个标签。RESERVED表示一个保留字或操作符。INT表示一个文字整数。ID代表标识符。

    Python

    1

    2

    3

    4

    5

  • import lexer

    RESERVED = 'RESERVED'

    INT= 'INT'

    ID = 'ID'

  • 接下来定义词法分析器将会用到的标记符表达式。前两个表达式匹配空格和注释。它们没有标签,所以 lex 会丢弃它们匹配到的所有字符。

    Python

    1

    2

    3

  • token_exprs = [

    (r'[ nt]+',None),

    (r'#[^n]*', None),

  • 然后,只剩下所有的操作符和保留字了。记住,每个正则表达式前面的“r”表示这个字符串是“raw”;Python不会处理任何转义字符。这使我们可以在字符串中包含进反斜线,正则表达式正是利用这一点来转义操作符比如“+”和“*”。

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

  • (r':=', RESERVED),

    (r'(',RESERVED),

    (r')',RESERVED),

    (r';', RESERVED),

    (r'+',RESERVED),

    (r'-', RESERVED),

    (r'*',RESERVED),

    (r'/', RESERVED),

    (r'<=',RESERVED),

    (r'<', RESERVED),

    (r'>=',RESERVED),

    (r'>', RESERVED),

    (r'=', RESERVED),

    (r'!=',RESERVED),

    (r'and', RESERVED),

    (r'or',RESERVED),

    (r'not', RESERVED),

    (r'if',RESERVED),

    (r'then',RESERVED),

    (r'else',RESERVED),

    (r'while', RESERVED),

    (r'do',RESERVED),

    (r'end', RESERVED),

  • 最后,轮到整数和标识符的表达式。要注意的是,标识符的正则表达式会匹配上面的所有的保留字,所以它一定要留到最后。

    Python

    1

    2

    3

  • (r'[0-9]+',INT),

    (r'[A-Za-z][A-Za-z0-9_]*', ID),

    ]

  • 既然正则表达式已经定义好了,我们还需要创建一个实际的lexer函数。

    Python

    1

    2

  • def imp_lex(characters):

    return lexer.lex(characters, token_exprs)

  • 如果你对这部分感兴趣,这里有一些驱动代码可以测试输出:

    Python

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

  • import sys

    from imp_lexer import *

    if __name__ == '__main__':

    filename = sys.argv[1]

    file = open(filename)

    characters = file.read()

    file.close()

    tokens = imp_lex(characters)

    for token in tokens:

    print token

  • 继续……

    在本系列的下一篇文章中,我会讨论解析器组合,然后描述如何使用他们从lexer中生成的标记符列表建立抽象语法树。

    如果你对于实现IMP解释器很感兴趣,你可以从这里下载全部的源码。

    在源码包含的示例文件中运行解释器:

    Python

    1

  • python imp.py hello.imp

  • 运行单元测试:

    Python

    1

  • python test.py

Ⅱ python ide怎么编译运行

Python IDE

本文为大家推荐几款款不错的Python IDE(集成开发环境),比较推荐 PyCharm,当然你可以根据自己的喜好来选择适合自己的 Python IDE。

PyCharm

PyCharm 是由 JetBrains 打造的一款 Python IDE。

PyCharm 具备一般Python IDE的功能,比如:调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。

另外,PyCharm 还提供了一些很好的功能用于 Django 开发,同时支持 Google App Engine,更酷的是,PyCharm 支持 IronPython。

PyCharm 官方下载地址:

效果图查看:

Ⅲ Python程序代码混淆、编译、打包、运行(桌面程序防破解向)

像Python这种解释性的语言,要想私有化部署的同时又保护好源码,就像是对于鱼和熊掌的追求。

虽然做不到尽善尽美,但是对代码进行混淆,增加一点破解的难度,或许能规避一些泄露的风险。

本次演示环境:linux

确保要发布的包根目录("demo")中有__main__.py文件,这个是程序执行入口。

编译

批量改名.pyc文件

移动.pyc文件

清理.py文件

清理__pycache__文件夹

打包成zip

运行时只要将zip文件作为参数即可

最终整合脚本

调用方式

对于在变量和函数名上的混淆有点小儿科,而对于跨文件的类名的混淆又太容易实现。

所以对于混淆程度的取舍,要视工程的规模而定。

2.1 混淆工具pyminifier

在原来的工具 pyminifier上修复了几个bug。

安装:

python3 安装

或者clone下来,自行安装

使用例子

2.2 源码变更

不同的配置对于源码的要求不同,以下是笔者踩过的坑。

其他混淆想法

结合混淆、编译和打包,尝试出以下发布脚本。

主要的思路 :创建一个工作目录tmp,然后在此目录下混淆、编译python代码,完成后把内容打包成pyc文件,再将pyc文件和其他配置文件移动到dist,发布dist即可。

混淆的目的是最大程度保护源码,在发布到客户端后不被轻易破解。

Ⅳ Python最好IDE Pycharm使用小技巧总结

Python最好IDE:Pycharm使用小技巧总结:

1、pycharm的设置

从file下的setting进入设置,

然后我们进入到设置界面,首先我们可以设置界面的风格和工具栏字体大小,如红线所示

接下来我们一般会设置写代码时的字体风格,选择合适的字体和大小以及间隔,有利于编写程序时的心情舒畅,写起来一溜溜的。。。

接下来我们需要指定我们的编码形式,这样有利于我们的代码编译书写

毕竟utf-8编译码模式符合中国人的编码习惯,再接下来我们希望在每次写代码时可以在文件头写上一些关于本文件的信息,例如时间、编译器等等,这样我们可以编写一个书写

template,这样每次新建一个文件会自动在文件头为我们添上这些信息,这里以py文件为例,可以照着这个模式来写

为了方便,我就讲它们直接敲出来了,可以直接复制啦!

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:albert time:${DATE}

接下来就是重头戏,我们需要指定编译器,这才是灵魂操作,

2、pycharm使用和快捷键

在pycharm里可以加载python使用的第三方库,只要在指定编译器后,点击右边的加号,进入搜索框找到你要加载的第三方库即可,但是这种方式太慢了,一般我们在终端用pip结合镜像来安装,所以在这里就不做详细说明。

至于快捷键,不同版本的可能略微有区别,常用的几个:

注释:选中后 Ctrl + /

定位:Ctrl + 鼠标左键

缩进:Tab / Tab+shift

换行:shift + enter

编译:Ctrl+shift+F10

查看路径:ctrl+l (或在终端输入pwd)

3、pycharm使用碰到的一些问题

有时候我们在写代码时会发现代码下面会出现一些波浪号(非编码错误),治根的办法就是在设置里将pycharm里的检测选项去掉

在run代码时出现无法编译情况

一般我们想运行代码,可以鼠标右键run一下当前文件即可,可是有时出现下面这种情况

我们需要做的就是将py文件的名字换一下即可。

更多Python知识,请关注:Python自学网!!

Ⅳ python的编译器怎么安装

在各种python编译器里面,jupyter是最好用的一个编译器了,占内存少,而且是在浏览器里面打开。
最主要的是,它可以在同一个页面里面,进行多段代码的分别调试,而互相之间不会形成干扰。
下面,我就介绍一下,怎么安装这款编译器。
1、首先你要安装好Python(此过程不做讲解),然后打开命令提示符,
在命令提示符里面输入:pip install jupyter
点击回车,电脑就会开始自动安装jupyter编译器。
安装的东西很多,如果要自己手动安装的话,是很繁琐的。
安装完成之后,在命令提示符里面输入:jupyter notebook
按回车,就可以打开jupyter编译器了。
注意,这个命令提示符不要提前关闭,否则jupyter编译器就会失效。
更多Python相关技术文章,请访问Python教程栏目进行学习!以上就是小编分享的关于python的编译器怎么安装的详细内容希望对大家有所帮助,更多有关python教程请关注环球青藤其它相关文章!

Ⅵ 如何编译Python使之成为可执行程序

Python是一个强大的工具,可惜不是每个人的计算机里面都有安装。当您写了一个好用的工具。要如何让那些没有安装Python的人使用你的工具呢?
对于这样一个需要standalone exectuable环境的需求,直到撰写经验为止,只看到两个比较好用且有持续维护的套件。一个是py2exe。另外一个就是本经验要介绍的PyInstaller。
1
PyInstaller安装

2

最新版本:PyInstaller 2.0
3

直接“解压缩”之后即可使用,解压到您想让他在的路径即可
END

PyInstaller配置

1
事先写好py程序
2

在命令行执行:python Makespec.py --console --onefile NotePad\notepad.py
报错:Configfile is missing or unreadable. Please run Configure.py before building
3

在命令行执行:Configure.py
报错:Python 2.6+ on Windows support needs pywin32,Please install http://sourceforge.net/projects/pywin32/
4

安装最新版本的 pywin32-217.win32-py2.7.exe
END

PyInstaller使用

命令行中运行
目录切换到PyInstaller的安装目录“E:\pyinstaller-1.5\pyinstaller-1.

在PyInstaller的安装目录下新建一个文件夹(比如NotePad), 然后将要转换的py脚本放到文件夹里(notepad.py)
E:\pyinstaller-1.5\pyinstaller-1.5>python Makespec.py --console --onefile NotePad\notepad.py

E:\pyinstaller-1.5\pyinstaller-1.5>python Build.py NotePad\notepad.spec

验证exeE:\pyinstaller-1.5\pyinstaller-1.5>

E:\pyinstaller-1.5\pyinstaller-1.5\NotePad\dist\notepad.exe 0 0 100(成功)

查看生成的文件,生成的中间文件spec
查看生成的文件,生成的最终文件exe

END

注意事项

在转换之前要确保py程序可以正常通过
如果转换过程中出现什么错误,用搜索引擎搜索解决一下

Ⅶ 怎么用codeblocks打开python代码并编译运行

环境配置:

使用IDE: Code::Blocks,在编译时需要连接python的库,setting->complier and debugger setting->Linker setting->Link Libraries, 增加两个库python25.lib, libpython25.lib。 或者在Build option里面设置linker setting也可。

热点内容
易语言自动喊话源码 发布:2024-11-17 11:13:11 浏览:588
virtualbox虚拟机共享文件夹 发布:2024-11-17 11:12:25 浏览:424
电脑开机密码忘记了如何恢复 发布:2024-11-17 11:10:48 浏览:320
如何开启微信支付密码错误 发布:2024-11-17 10:59:02 浏览:500
数列的c语言编程 发布:2024-11-17 10:33:50 浏览:136
服务器换ip多久生效 发布:2024-11-17 10:33:49 浏览:387
ipad导出缓存b站视频 发布:2024-11-17 10:29:33 浏览:356
mc手机版服务器搭建 发布:2024-11-17 10:23:38 浏览:55
丰田普拉vxl什么配置 发布:2024-11-17 10:23:37 浏览:80
clindexphp 发布:2024-11-17 10:22:12 浏览:48