【Python学习手册(第四版)】学习笔记03.2-如何运行程序-2模块导入与重载

首先为什么选择这本书,国内外网上教程一大堆,可能是一方面大家都在说国内外教材自学、编写水平等差异较大,另一方面算是个人复习吧,也想见识一下对比之前学习的内容,这本书有什么出彩的地方。个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习交流。


目录

模块导入

重载

模块的显要特性:属性

交互对话下import和reload的使用注意事项


模块导入

导入模块是一种启动程序的方法,下面简单介绍一些模块的基础知识。

每一个以扩展名py结尾的Python源代码文件都是一个模块。其他的文件可以通过导入一个模块读取这个模块的内容。导入从本质上来讲,就是载入另一个文件,并能够读取那个文件的内容。一个模块的内容通过这样的属性(后面讲到)能够被外部世界使用。

这种基于模块的方式使模块变成了Python程序架构的一个核心概念。更大的程序往往以多个模块文件的形式出现,并且导入了其他模块文件的工具。其中的一个模块文件设计成主文件,或叫做顶层文件(就是那个启动后能够运行整个程序的文件)。

后面会对这样的架构问题有更深入的探索。这里最关心的是被载入的文件通过导入操作最终可运行代码。正是如此,导入文件是另一种运行文件的方法。

例如,如果开始一个交互对话(从系统命令行、从开始菜单或者在IDLE中),运行之前创建的文件script1.py

import sys
print(sys.platform)
print(2 ** 100)
x = 'Spam!'
print(x * 8)

通过简单的import来实现。

这可以运行,但是在默认情况下,只是在每次会话的第一次运行。在第一次导入之后,其他的导入都不会再工作,甚至在另一个窗口中改变并保存了模块的源代码文件也不行。

这是有意设计的结果。导入是一个开销很大的操作,以至于每个文件、每个程序运行不能够重复多于一次。导入必须找到文件,将其编译成字节码,并且运行代码。

重载

如果真的想要Python在同一次会话中再次运行文件(不停止和重新启动会话),需要调用imp标准库模块中可用的reload函数。(python 2.6内置,3.0不内置)Python 3.0中,运行import imp并使用imp.reload(M)

举例:

可以看到重新导入包了。

reload函数载入并运行了文件最新版本的代码,如果已经在另一个窗口中修改并保存了它,那将反映出修改变化。

这允许你在当前交互会话的过程中编辑并改进代码。

例如,这次会话中,在第一个import和reload调用这段时间里,在script1.py中的第二个打印语句在另一个窗口中改成了2**10。

reload函数希望获得的参数是一个已经加载了的模块对象的名称,所以如果在重载之前,请确保已经成功地导入了这个模块。值得注意的是,reload函数在模块对象的名称前还需要括号,import则不需要。reload是一个被调用的函数,而import是一个语句。


模块的显要特性:属性

导入和重载提供了一种自然的程序启动的选择,因为导入操作将会在最后一步执行文件。从更宏观的角度来看,模块扮演了一个工具库的角色。

从一般意义上来说,模块往往就是变量名的封装,被认作是命名空间。在一个包中的变量名就是所谓的属性:也就是说,属性就是绑定在特定的对象上的变量名(就像一个模块)。

在典型的应用中,导入者得到了模块文件中在顶层所定义的所有变量名。这些变量名通常被赋值给通过模块函数、类、变量以及其他被导出的工具。这些往往都会在其他文件或程序中使用。表面上来看,一个模块文件的变量名可以通过两个Python语句读取——import和from,以及reload调用。

演示下,文本编辑器创建一个名为myfile.py的单行的Python模块文件,其内容如下所示:

tittle = 'The Meaning of Life'

它只包含了一行赋值语句,但是它已经足够讲明白基本的要点。当文件导入时,它的代码运行并生成了模块的属性。这个赋值语句创建了一个名为title的模块的属性。

可以通过两种不同的办法从其他组件获得这个模块的title属性。第一种,你可以通过使用一个import语句将模块作为一个整体载入,并使用模块名后跟一个属性名来获取它:

一般来说,这里的点号表达式代表了object.attribute的语法,可以从任何的object中取出其任意的属性,并且这是Python代码中的一个常用操作。这里已经使用了它去获取在模块myfile中的一个字符串变量title,即myfile.title。

作为替代方案,可以通过这样的语句从模块文件中获得(实际上是复制)变量名:

from和import很相似,只不过增加了对载入组件的变量名的额外的赋值。从技术上讲,from复制了模块的属性,以便属性能够成为接收者的直接变量。因此,能够直接以title(一个变量)引用导入字符串而不是myfile.title(一个属性)引用[1]

无论使用的是import还是from去执行导入操作,模块文件myfile.py的语句都会执行,并且导入的组件(对应这里是交互提示模式,也就是命令窗口)在顶层文件中得到了变量名的读取权。

在这个简单的例子中只有一个变量名(变量title被赋值给一个字符串)。

但是如果开始在模块中定义对象,例如,函数和类时,这个概念将会很有用。这样一些对象就变成了可重用的组件,可以通过变量名被一个或多个客户端模块读取。

在实际应用中,模块文件往往定义了一个以上的可被外部文件使用的变量名。

举个例子:treenames.py定义了3个变量名,给三个变量赋值,并对外部世界生成了三个属性。

a = 'red'
b = 'green'
c = 'blue'
print(a, b, c)

这个文件并且在一个print语句中使用它自有的三个变量,就像在将其作为顶层文件运行时看到的结果一样:

所有的这个文件的代码运行起来就和第一次从其他地方导入(无论是通过import或者from)后一样。这个文件的客户端通过import得到了具有属性的模块,而客户端使用from时,则会获得文件变量名的复本

为什么打印出来是括号内?实际上它们是元组。

一旦你开始就像这里一样在模块文件编写多个变量名,内置的dir函数开始发挥作用了。你可以使用它来获得模块内部的可用的变量名的列表。下面代码返回了一个Python字符串列表:

dir函数就像这个例子一样,通过把导入模块的名称传至括号里,进行调用后,它将返回这个模块内部的所有属性。其中返回的一些变量名是“免费”获得的:一些以双下划线开头并结尾的变量名,这些通常都是由Python预定义的内置变量名,对于解释器来说有特定的意义。那些通过代码赋值而定义的变量(a、b和c)在dir结果的最后显示。

[1]注意,import和from列出模块名时,都是使用myfile,没有.py后缀。当Python寻找实际文件时,知道在搜索程序中加上后缀名。然而,系统shell命令行中,一定要记得加上后缀名,但是import语句中则不用。


模块和命名空间

模块导入是一种运行代码文件的方法,同样是Python程序最大的程序结构。

一般来说,Python程序往往由多个模块文件构成,通过import语句连接在一起。每个模块文件是一个独立完备的变量包,即一个命名空间。一个模块文件不能看到其他文件定义的变量名,除非它显式地导入了那个文件,所以模块文件在代码文件中起到了最小化命名冲突的作用。因为每个文件都是一个独立完备的命名空间,即使在它们拼写相同的情况下,一个文件中的变量名是不会与另一个文件中的变量冲突的。

正是由于模块将变量封装为不同部分,Python具有了能够避免命名冲突的优点。后面讨论模块和其他的命名空间结构(包括类和函数的作用域)。就目前而言,模块是一个不需要重复输入而可以反复运行代码的方法。

注意:import VS from:from语句在某种意义上战胜了模块的名称空间分隔的目的,因为from把变量从一个文件复制到另一个文件,这可能导致在导入的文件中相同名称的变量被覆盖(并且,如果发生这种情况的话,不会为你给出警告)。这根本上会导致名称空间重叠到一起,至少在复制的变量上会重叠。

有些人建议使用import而不是from。实际不建议这么做,不仅因为from更短,而且因为它的问题在实际中几乎不是问题。这是由代码编写人员来控制的问题,可以在from中列出想要的变量;只要你理解它们将是要赋的值,这不会比编写赋值语句更危险,而赋值是你可能想要使用的另一功能。


交互对话下import和reload的使用注意事项

知道通过import和reload运行文件,有些人就会倾向于仅使用这个方法,而忽略了能够运行最新版本的代码的其他选择(例如,图标点击、IDE/IDLE菜单选项以及系统命令行)。

你需要记住是何时导入的,才能知道能不能够reload,你需要记住当调用reload时需要使用括号,并且要记住让代码的最新版本运行时首先要使用reload。此外,reload是不可传递的,重载一个模块的话只会重载该模块,而不能够重载该模块所导入的任何模块,因此,有时候必须reload多个文件。

现在开始就要避免使用import和reload启动程序,通常使用IDE/IDLE菜单的run-》run module选项,提供了一个简单并更少错误的运行文件的方法,并且总是运行代码的最新版本。系统shell命令行提供了类似的优点。如果使用这些技术的话,不需要使用reload。

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
从提供的引用内容来看,这个错误提示是在运行某个程序时出现的。错误提示指出缺少一个名为libopenblasp-r0-39a31c03.2.18.so的共享对象文件,导致无法打开该文件或目录。然而,根据提供的引用内容,我没有找到直接相关的解决方案或信息。因此,我无法提供详细的解决方法。建议您进行以下几步来解决该问题: 1. 确认您的系统中是否安装了执行该程序所需的所有依赖项。您可以查看程序的文档或官方网站,以获得所需的依赖项列表。 2. 检查程序所需的共享对象文件是否存在于系统中。您可以使用命令行工具(如ls命令)搜索该文件,或者使用文件管理器进行手动搜索。 3. 如果缺少共享对象文件,您可以尝试重新安装或更新相关软件包,以确保所有依赖项得到满足。 4. 如果问题仍然存在,您可以尝试在相关的技术论坛或社区中寻求帮助。提供更多关于您的操作系统、程序版本和具体错误信息的信息可能有助于其他人更好地理解和解决问题。 请记住,我无法提供直接的解决方法,因为缺少了与该错误具体相关的信息和上下文。建议根据上述步骤进行排查,并与相关的技术论坛或社区寻求帮助,以获得更准确和具体的解决方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Original error was: libopenblasp-r0-39a31c03.2.18.so: cannot open shared object file: No such file o](https://blog.csdn.net/frankcreen/article/details/78910187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [leetcode-112. Path Sum](https://blog.csdn.net/frankcreen/article/details/62881115)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz](https://download.csdn.net/download/tan3739/10401811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴焉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值