【Python学习】python学习手册--第三章 如何运行程序

交互式运行程序

在计算机上,最简单运行Python程序的方法就是直接调用Python程序,与Python交互式运行程序,即输入一句命令,马上返回结果,类似于unix里面的执行命令。

liximin@ubuntu:~$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello World")
Hello World
>>> 

交互模式下,每一句输入的命令都会立即运行,并且会自动将输入语句的结果打印出来。可以执行ctrl-D或关闭窗口来结束Python程序。
交互模式主要有以下几个作用:

  • 实验:在交互模式下,所有语句都是立即输出结果,这样的环境就给程序员一个绝佳的实验环境。不会对计算机上的其他程序造成任何影响。
  • 测试:在开发过程中,交互模式下也是一个测试语句的绝佳环境。对于拿不准的语句,可以在交互模式下调试,以输出自己想要的结果。

交互模式下常见的一些问题总结如下:

  • 交互模式下只能运行Python语句。
  • 在Python文件中,打印语句print是必需的。交互模式下,Python语句是直接输出结果,这跟文件中的程序很不一样,Python程序在需要输出结果时,必须使用打印语句(print)。
  • 交互模式下不需要缩进:在确定没有任何嵌套语句的情况下,Python语句都从第一列开始写起。每一行开头有空格,会产生错误的信息。
  • 留意交互模式下,提示符的变化和复合语句。在输入复合语句时,你会注意到,Python程序上的提示符会发生变化。
>>> for i in range(5):
...    print(i) #注意这里提示,每行开头的提示符发生了变化
...         #需要多输入一个回车,以结束符合语句。这是交互模式下的特性,在文件中不是必需的。
0
1
2
3
4
  • 交互模型下,一次运行一条语句。在运行完成一条语句之后才能输入下一条语句。

系统命令行和文件

交互模式下,运行后的命令无法保存。需要执行大量程序时,我们最好把他们保存在.py文件中,再执行Python文件。一个Python程序(.py文件)通常叫做模块。模块是包含了Python程序的简单文本文件。一旦编写完成,可以让Python解释器多次运行。一个Python程序是有很多Python命令组成的(就像Linux中的shell一样)。

  • 保存文件时,主要将Python程序默认保存为.py的扩展名。尤其是在window系统下,默认情况下,是将文件扩展名隐藏了。
  • 在运行Python程序时,需要更上.py扩展名。而在Python程序里导入模块时,就不需要跟扩展名。

    • 运行modul模块:python modul.py
    • 在Python中导入modul模块: import modul
  • 在python文件中需要输出某个结果时,需要使用打印语句(print),这也是Python文件运行和交互模式下运行,最主要的特征。

Unix可执行脚本(#!)

如果Python在UNIX类系统上运行,就可以视其为可执行程序,它主要有两个特征:

  • 它们的第一行是特定的(与shell脚本一样,以#!开头),第一行标注了Python解释器的位置。
  • Python文件都必须要拥有可执行权限。

在UNIX类系统上,避免硬编码Python解释器的路径,我们可以使用env命令:
#! /user/bin/env python
这样编写的好处是通过env程序来查找Python解释器的位置。提供程序的可移植性,不用在更换计算机环境时重新修改。当然这是在env程序在任何系统位置不变的情况下, 如果env程序在不同位置,那么可移植性就无从谈起了。

还有一些情况是在windows环境下直接双击py文件直接运行的,这时程序会像一个处理程序一样,对话框一闪而过。应对这种情况,可以在程序的最末尾加入内置函数input(),这样窗口会在敲下回车之后消失。直接双击文件运行最好是在调试好程序之后,否则一些运行错误会一闪而过,最后停止,你也不知道程序执行是否正确。

版本差异提示,2.6或者更早的版本使用raw_input()函数,在3.0版本中是使用input()函数。

模块导入和重载

之前讲过,一个python程序文件就可以成为一个模块,其它文件都能够导入这个模块的内容,导入从本质上讲就是载入另一个文件中的内容。模块的组织方式成了Python一个特点,一些很大的程序往往都是以多个模块出现,并且运用了许多外部的模块。真正需要用来执行,启动后能够运行整个程序的文件成为主文件,有时候也叫做顶层文件

在第一次导入某个模块之后,再次执行导入操作,就不会再由任何效果

print("import modul successfully.")   #importmodul.py 文件中的内容

导入modul效果:

Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import importmodul #第一次导入会执行文件,产生效果
import modul successfully.
>>> import importmodul  # 后面再执行导入操作,就不会有效果
>>> 

Python这么做的原因就是因为导入也是一个比较消耗资源的操作,在执行导入时,Python文件会编译成为字节码,并且运行代码。在其他终端修改了同样的文件代码再执行import也是没有效果的。
如果真的需要在同一个文件或者会话中,多次导入同一个模块,可以调用imp标准库模块中的reload函数


>>> import imp
>>> import importmodul
import modul successfully.
>>> import importmodul      # 直接使用import将不会有作用
>>> imp.reload(importmodul) # 使用reload函数重新导入
import modul successfully.
<module 'importmodul' from '/home/liximin/Learn/importmodul.py'>       
# 这一行显示,reload函数返回的是导入模块的对象
>>> 

reload函数参数是一个已经加载过的模块对象的名称,所以在执行reload重载之前,请确保你重载的模块在之前被导入过。

在Python3.0版本中,reload函数放入imp模块中,需要导入才能使用。但是在2.6之前的版本,reload作为Python的内置函数,可以直接使用,不需要导入。

模块的“属性”

从宏观的角度来看,模块扮演了工具库的一个角色。模块往往是变量名的封装,被认为是命名空间,模块中的变量名就是所谓的属性,属性就是绑定在特定对象上的变量名
在应用中,导入模块后会得到模块在外层定义的所有变量名。

liximin@ubuntu:~/Learn$ cat Attribute.py 
Focus="Learning need Focus"
liximin@ubuntu:~/Learn$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import Attribute
>>> Attribute.Focus                 #这里需要跟上模块名以确定程序的命名空间
'Learning need Focus'
>>> Focus                           #如果直接使用,就会报错,提示没有定义
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Focus' is not defined
>>> from Attribute import Focus     #通过from方式,可以直接使用Focus变量。
>>> Focus                            
'Learning need Focus' 
>>> 

from与import很相似,from只不过增加了对载入组件属性的额外复制,会获得导入变量名的副本从技术上讲,from复制了模块的属性,并且将它赋值给接受者的直接变量,所以通过from来的属性,不需加上命名空间,而是可以直接使用。无论使用的是import还是from语句,模块的代码都会被执行,并且在文件的顶层上,获得导入模块的读取权
导入模块后,可以使用dir函数,来看模块中能使用的变量名的列表。

>>> import Attribute       
>>> dir(Attribute)
['Focus', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] 
>>> 

上面的变量名列表中,可以看到一些额外的以双下划线开头并结尾的变量名,这些变量名都是Python预定义的内置变量名,它们对于解释器来说有特殊的含义。

模块和命名空间

一般来说,Python程序都是由很多模块(Python文件)组合而成,每一个模块就像一个包,即命名空间,它们装有自己的变量名,每一个模块都是独立的命名空间,它们用来解决变量的命名冲突。

在使用from时,要理解到它相当于在接受者的空间内新建了一个变量名称,这样可能会导致相同命名空间下,相同变量名的覆盖。如果使用时注意到这一点,from的导入会将变量名变得更短,让编程更简洁。

import和from注意事项

import和from只是用于导入和重载模块的,它有执行python程序的效果,但是完全不能够用来执行python程序。同时reload是不可传递的,它不能够重载模块中需要导入的其它任何模块。有时还必须有多个reload。
可运行模块的exec函数

>>> open('Attribute.py').read()
'Focus="Learning need Focus"\n' 
>>> exec(open('Attribute.py').read()) #效果就像将代码复制到它的位置,将它执行一下。
>>> Focus
'Learning need Focus'
>>> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章