Python可以以多种方式与其他语言编写的组件“粘接”在一起,例如Python的C语言API可以让Python灵活地调用C程序。
一旦程序编译为字节码,之后的字节码发送到Python虚拟机上来执行。
CPython、Jython和IronPython都是通过同样的方式实现Python语言的,即通过把源代码编译为字节码,然后在适合的虚拟机上执行这些字节码。
然而,其他的系统,如Psyco及时编译器(JIT)和Shedskin C++转换器,则试着优化基本执行模块。
通过一些第三方工具,将Python程序转换为可执行程序(在Python世界中,被称为冻结二进制文件)。
冻结二进制文件能够将程序的字节码、PVM以及任何程序所需要的支持文件捆绑在一起形成一个单独的可执行二进制程序。这个程序可以轻松地向用户分发。
目前主要有3种工具能够生成冻结二进制文件:
最简单的运行Python程序的办法就是在Python交互命令行中输入这些程序。
>>>
。Python 3.4.3 (default, Nov 12 2018, 22:25:49)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('hello world!')
hello world!
>>> print(2**8)
256
>>>
注意事项:
只能输入Python语句
在交互提示模式中会自动打印结果,但源文件则不会
留意提示符的变换和复合语句的缩进
在交互提示模式中,用一个空行结束复合语句
为了能够永久的保存程序,需要在文件中写入代码,这样的文件通常叫做***模块***。
***模块***是一个包含了Python语句的简单文本文件。
一旦编写完成,可以让Python编译器多次运行,且可以以多种方式运行。
C:\tmp> python test.py
script.py
,在导入此模块时,则为import script
。print()
来进行输出。如果在Python、Linux及其他的UNIX类系统上使用Python,可以将Python代码编写为可执行脚本,就像使用Shell语言编写的csh
或sh
脚本一样。
注意事项如下:
#!
开始,其后紧跟Python解释器的路径,或者使用#!/usr/bin/env python
让系统通过环境变量自动查找python虚拟机的路径。#!/usr/bin/env python
print("hello world!")
在Windows下,注册表使通过点击图标打开文件变得很容易。
当Python程序文件点击打开时Python自动注册为所运行的那个程序。
在Windows下以窗口模式运行Python模块时,程序飞快运行完后,窗口会立即关闭,这样不利于查看输出,可以在程序末尾添加一个input
函数来中断程序。
每个以扩展名.py
结尾的Python源代码文件都是一个模块。其他的文件可以通过导入一个模块读取这个模块的内容。从本质上讲,导入就是载入另一个文件,并能够读取那个文件的内容。
正因为如此,导入文件是运行文件的另一种方式。但只有在第一次导入时会运行,再次重复导入操作并不会再次运行文件。
如果想要在Python同一会话中再次运行文件(不停止和重新启动会话),在Python 2.x中可以使用内置的reload
函数,此函数在Python 3.X中被移到了imp
模块中。
注意:
reload
函数是不可传递的,重载一个模块时,不会重载此模块所导入的任何模块。
# python3.x 需要先从模块imp中导入reload函数
from imp import reload
reload(script)
注意:用一个
from
载入的模块名字不会通过一个reload直接更新,但是用一条import
语句访问的名字则会。如果你的模块名字似乎不会在一次重载后改变,尝试使用import
和module.attribute
名字引用。
导入模块将得到模块文件中在顶层所定义的所有变量名。
一个模块文件的变量名可以通过2个Python语句读取: import
和from import
,也可以通过reload
函数调用。
比如有一个名为 mymodule.py
的模块文件,其内容为:
title = "The Meaning of Life"
使用import
语句将模块作为一个整体载入,得到具有属性的模块,并使用 module.attribute
方式来获取模块的属性:
root@localhost:/tmp# python
>>> import mymodule
>>> print(mymodule.title)
The Meaning of Life
>>>
使用 from import
语句从模块文件中复制变量到当前模块中:
root@localhost:/tmp# python
>>> from mymodule import title
>>> print(title)
The Meaning of Life
>>>
从技术上讲,from import
复制了模块的属性,以便属性能够成为接收者的直接变量。因此,能够直接以变量名 title
(一个变量)引用导入字符串变量而不是 mymodule.title
(一个属性引用)。
无论使用的是import
语句还是from import
语句去执行导入操作,模块文件中的所有语句都会被执行,并且在顶层文件中得到了所导入组件的变量名的访问权。
现在有一个Python脚本文件test.py
,其内容如下:
a = 'dead'
b = 'parrot'
c = 'sketch'
print(a, b, c)
直接运行test.py
:
root@LEGEND-PC:/tmp# python test.py
('dead', 'parrot', 'sketch')
在交互模式下导入test.py
:
root@LEGEND-PC:/tmp# python3
Python 3.4.3 (default, Nov 12 2018, 22:25:49)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
dead parrot sketch
# 注意到导入模块后,模块便自动运行了,打印输出了结果。
>>> test.a
'dead'
>>> test.b
'parrot'
>>> test.c
'sketch'
>>> from test import a,b,c
# 注意到导入模块后,模块便自动运行了,打印输出了结果。
>>> b
'parrot'
>>> c
'sketch'
>>> a
'dead'
>>> b,c
('parrot', 'sketch')
>>>
使用dir()
函数可以查看所导入的模块的所有属性名的列表。其中以双下划线开头并结尾的变量名是由Python预定义的内置变量名,对于解释器来说有特定的意义。
>>> dir(test)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b', 'c']
>>>
每个模块文件都是一个独立完备的命名空间,可以解决变量或属性命名冲突的问题,不同模块文件中的变量名即使相同,也不会冲突。
注意:
from import
语句把变量从一个文件复制到另一个文件,这可能会导致在导入的文件中相同名称的变量被覆盖(并且,发生这种情况时不会发出警告)。
exec
函数不会导入模块,而是每次都重新运行模块文件的最新版本,
exec(open('myscript.py').read())
注意:exec()
的工作机制就好像是在调用它的地方粘贴了代码,所以和from import
语句一样,有可能造成同名变量的覆盖。例如,下面例子中变量a,b,c的值都被exec()调用所覆盖了。
root@LEGEND-PC:/tmp# python3
Python 3.4.3 (default, Nov 12 2018, 22:25:49)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 111
>>> b = 222
>>> c = 333
>>> exec(open('test.py').read())
dead parrot sketch
>>> # 可以看到变量a,b,c的值都被exec()调用所覆盖了
Python 2.X还包含一个内置函数execfile
可以直接运行给定模块文件名的模块:
# python 2.x包含内置函数execfile
execfile('myscript.py')
IDLE提供了做Python开发的GUI,而且它是Python系统的一个标准并免费的部分。
由于IDEL是使用Tkinter GUI工具包开发的Python程序,可以在几乎任何Python平台上运行.
.py
除了基本的编辑和运行功能,IDLE还提供了很多高级的特性,包括指向点击(point-and-click)程序调试和对象浏览器。
一些最常用的IDE:
除了在命令行中运行、点击图标、import、exec、使用IDLE等方法,还有其他运行Python的方法,其中大多数都有专门或有限的用途。
调试Python代码
这里快速介绍调试Python程序时的常用策略:
- 阅读出错消息并修改标记的行和文件
- 插入
- 使用IDE GUI调试器
- 使用pdb命令行调试器