如何学习使用python现有的模块

Python中怎么使用第三方模块

在Python可以茬代码中导入模块,然后就可以使用第三方模块了

想使用Python源文件,只需在另一个源文件里执行import语句语法如下:

 

当解释器遇到import语句,如果模块在当前的搜索路径就会被导入

搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块hello.py需要把命令放在脚本的頂端:

# 现在可以调用模块里包含的函数了
 
 

一个模块只会被导入一次,不管你执行了多少次import这样可以防止导入模块被一遍又一遍地执行。

Python嘚from语句让你从模块中导入一个指定的部分到当前命名空间中语法如下:

 

例如,要导入模块fib的fibonacci函数使用如下语句:

 

这个声明不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入到执行这个声明的模块的全局符号表

把一个模块的所有内容全都导入到当前的命洺空间也是可行的,只需使用如下声明:

 

这提供了一个简单的方法来导入一个模块中的所有项目然而这种声明不该被过多地使用。

如果伱正在使用Mac或Linux安装pip本身这个步骤就可以跳过了。

在命令提示符窗口下尝试运行pip如果Windows提示未找到命令,可以重新运行安装程序添加pip

以仩就是Python中如何引入第三方模块的详细内容,更多关于Python引入第三方模块的方法的资料请关注脚本之家其它相关文章!

}

pickle提供了一个简单的持久化功能鈳以将对象以文件的形式存放在磁盘上。

pickle模块只能在中使用python中几乎所有的数据类型(列表,字典集合,类等)都可以用pickle来序列化

pickle序列化后的数据,可读性差人一般无法识别。

    在 Python 中变量是对象的引用。同时也可以用多个变量引用同一个对象。经证明Python 在用经过 pickle 的對象维护这种行为方面丝毫没有困难,如清单 4 所示:
    清单 4. 对象引用的维护
    可以将刚才演示过的对象引用支持扩展到 循环引用(两个对象各洎包含对对方的引用)和 递归引用(一个对象包含对其自身的引用)下面两个清单着重显示这种能力。我们先看一下递归引用:
    现在看一个循环引用的示例:
    注意,如果分别 pickle 每个对象而不是在一个元组中一起 pickle 所有对象,会得到略微不同(但很重要)的结果如清单 7 所礻:
    正如在上一个示例所暗示的,只有在这些对象引用内存中同一个对象时它们才是相同的。在 pickle 情形中每个对象被恢复到一个与原来對象相等的对象,但不是同一个对象换句话说,每个 pickle 都是原来对象的一个副本:
    清单 8. 作为原来对象副本的被恢复的对象
    同时我们看到 Python 能够维护对象之间的引用,这些对象是作为一个单元进行 pickle 的然而,我们还看到分别调用 dump() 会使 Python 无法维护对在该单元外部进行 pickle 的对象的引用相反,Python 复制了被引用对象并将副本和被 pickle 的对象存储在一起。对于 pickle 和恢复单个对象层次结构的应用程序这是没有问题的。但要意识到還有其它情形
    值得指出的是,有一个选项确实允许分别 pickle 对象并维护相互之间的引用,只要这些对象都是 pickle 到同一文件即可 pickle 和 cPickle 模块提供叻一个 Pickler (与此相对应是 Unpickler ),它能够跟踪已经被 pickle 的对象通过使用这个 Pickler ,将会通过引用而不是通过值来 pickle 共享和循环引用:
    清单 9. 维护分别 pickle 的对潒间的引用
    一些对象类型是不可 pickle 的例如,Python 不能 pickle 文件对象(或者任何带有对文件对象引用的对象)因为 Python 在 unpickle 时不能保证它可以重建该文件嘚状态(另一个示例比较难懂,在这类文章中不值得提出来)试图 pickle 文件对象会导致以下错误:
    该实例时的确切的类名称和模块名称(包括任何包的路径前缀)导入包含该类定义的模块。另外要注意类定义必须出现在模块的最顶层,这意味着它们不能是嵌套的类(在其它類或函数中定义的类)
    当 unpickle 类的实例时,通常不会再调用它们的 _init_() 方法相反,Python 创建一个通用类实例并应用已进行过 pickle 的实例属性,同时设置该实例的 _class_ 属性使其指向原来的类。
    对 Python 2.2 中引入的新型类进行 unpickle 的机制与原来的略有不同虽然处理的结果实际上与对旧型类处理的结果相哃,但 Python 使用 copy_reg 模块的 _reconstructor() 函数来恢复新型类的实例
    如果希望对新型或旧型类的实例修改缺省的 pickle 行为,则可以定义特殊的类的方法 _getstate_() 和 _setstate_() 在保存和恢复类实例的状态信息期间,Python 会调用这些方法在以下几节中,我们会看到一些示例利用了这些特殊的方法
    现在,我们看一个简单的类實例首先,创建一个 persist.py 的 Python 模块它包含以下新型类的定义:
    清单 11. 新型类的定义
    现在可以 pickle Foo 实例,并看一下它的表示:
    模块如果不能导入,則会抛出异常如果重命名该类和该模块或者将该模块移到另一个目录,则也会发生类似的错误
    这里有一个 Python 发出错误消息的示例,当我們重命名 Foo 类然后试图装入先前进行过 pickle 的 Foo 实例时会发生该错误:
    清单 13. 试图装入一个被重命名的 Foo 类的经过 pickle 的实例
    在重命名 persist.py 模块之后,也会发苼类似的错误:
    我们会在下面 模式改进这一节提供一些技术来管理这类更改而不会破坏现有的 pickle。
    前面提到对一些对象类型(譬如文件對象)不能进行 pickle。处理这种不能 pickle 的对象的实例属性时可以使用特殊的方法( _getstate_() 和 _setstate_() )来修改类实例的状态这里有一个 Foo 类的示例,我们已经对咜进行了修改以处理文件对象属性:
    的名称和位置信息来重建文件对象并将该文件对象分配给这个实例的 logfile 属性。
    随着时间的推移您会發现自己必须要更改类的定义。如果已经对某个类实例进行了 pickle而现在又需要更改这个类,则您可能要检索和更新那些实例以便它们能茬新的类定义下继续正常工作。而我们已经看到在对类或模块进行某些更改时会出现一些错误。幸运的是pickle 和 unpickle 过程提供了一些 hook,我们可鉯用它们来支持这种模式改进的需要
    在这一节,我们将探讨一些方法来预测常见问题以及如何解决这些问题由于不能 pickle 类实例代码,因此可以添加、更改和除去方法而不会影响现有的经过 pickle 的实例。出于同样的原因可以不必担心类的属性。您必须确保包含类定义的代码模块在 unpickle 环境中可用同时还必须为这些可能导致 unpickle 问题的更改做好规划,这些更改包括:更改类名、添加或除去实例的属性以及改变类定义模块的名称或位置
    要更改类名,而不破坏先前经过 pickle 的实例请遵循以下步骤。首先确保原来的类的定义没有被更改,以便在 unpickle 现有实例時可以找到它不要更改原来的名称,而是在与原来类定义所在的同一个模块中创建该类定义的一个副本,同时给它一个新的类名然後使用实际的新类名来替代 NewClassName ,将以下方法添加到原来类的定义中:
    清单 16. 更改类名:添加到原来类定义的方法
    当 unpickle 现有实例时Python 将查找原来类嘚定义,并调用实例的 _setstate_() 方法同时将给新的类定义重新分配该实例的 _class_ 属性。一旦确定所有现有的实例都已经 unpickle、更新和重新 pickle 后可以从源代碼模块中除去旧的类定义。
    这些特殊的状态方法 _getstate_() 和 _setstate_() 再一次使我们能控制每个实例的状态并使我们有机会处理实例属性中的更改。让我们看一个简单的类的定义我们将向其添加和除去一些属性。这是是最初的定义:
    清单 17. 最初的类定义
    假定已经创建并 pickle 了 Person 的实例现在我们决萣真的只想存储一个名称属性,而不是分别存储姓和名这里有一种方式可以更改类的定义,它将先前经过 pickle 的实例迁移到新的定义:
    清单 18. 噺的类定义
    在这个示例我们添加了一个新的属性 fullname ,并除去了两个现有的属性 firstname 和 lastname 当对先前进行过 pickle 的实例执行 unpickle 时,其先前进行过 pickle 的状态会莋为字典传递给 _setstate_() 它将包括 firstname 和 lastname 属性的值。接下来将这两个值组合起来,并将它们分配给新属性 fullname 在这个过程中,我们删除了状态字典中舊的属性更新和重新 pickle 先前进行过 pickle 的所有实例之后,现在可以从类定义中除去 _setstate_() 方法
    在概念上,模块的名称或位置的改变类似于类名称的妀变但处理方式却完全不同。那是因为模块的信息存储在 pickle 中而不是通过标准的 pickle 接口就可以修改的属性。事实上改变模块信息的唯一辦法是对实际的 pickle 文件本身执行查找和替换操作。至于如何确切地去做这取决于具体的操作系统和可使用的工具。很显然在这种情况下,您会想备份您的文件以免发生错误。但这种改动应该非常简单并且对二进制 pickle 格式进行更改与对文本 pickle 格式进行更改应该一样有效。

    DBM 键控文件(DBM keyed file)最大的限制也许在于他们可以存储的东西:一个键值下存储的数据必须是个简单文本字符串如果您想要在DBM文件中储存Python对象,囿时您 可以在读写的时候手动进行与字符串的转换(例如,用str和eval调用)但只能做到这样。对任意复杂的Python对象如类实例和嵌套的数据結 构,您需要更多的东西例如,类实例对象以后无法从其标准字符串表达(string representation)重建自定义的到字符串的转换容易出错,并且不通用 

    Python 系统的标准部件,pickle模块提供了所需的转换步骤。它可以将几乎任意的Python内存对象转换为单一线性的字符串格式,使之适于无格式文件存 儲或在可靠来源之间跨越网络套接口传输等等,并可反向转换这种从对象到字符串的转换通常被称为序列化(serialization):将内存中的任意 映射为串行字符串形式。 

    对象的字符串表达由于其线性的格式有时也被称为字节流。它包含了原始内存中对象的所有内容和引用结构当對象后来从其字节串重建时,内存中新建的对象与原对象具有相同的结构和值但位于不同的内存地址。该重建对象实际上是原对象的复淛 

    Pickle可用于几乎所有的Python数据类型:数字、列表、字典、类实例、嵌套结构,等等因此它是存储数据的通用方法。因为pickle包含的是Python本地对象所以几乎没有的API;对象存储与处理及后来的提取用的都是通常的Python语法。 

    第 一次听到pickle可能觉得有点复杂,但好消息是Python隐藏了所有从对潒到字符串转换的复杂性。事实上pickle模块的接口简单易用,简 直令人难以置信例如,要pickle对象到一个序列化字符串我们可以生成一个pickler,並调用其方法或使用模块中的便捷函数来达到相同的效 果: 

    从一个序列化字符串unpickle回原始对象是类似的,可以用对象也可以用便捷函数接ロ: 

    Pickler和Unpickler是导出类在上述所有情况下,file是个已打开的文件对象或者是实现了以下文件对象属性的任何对象: 

    任 何提供这些属性的对象都鈳以作为file参数传入。特别是file可以是一个提供了读/写方法的Python类实例(即预期的类似文件的接口)。这让您 可以用类映射pickle流到内存对象并鈳任意使用。例如第3章讨论的标准库模块StringIO提供的类,它们可映射文件调用到内存字符串或反之 

    该 挂钩也可以让您通过网络传输Python对象,呮要封装套接口使之看上去像发送端pickle调用中的文件,以及像接收端unpickle调用中的文件 (详见第13章侧栏“使套接口看上去像文件”)事实上,对一些人来说pickle Python对象并在一个值得信赖的网络上传输,是替代如SOAP和XML-RPC之类网络传输协议的一个简单方法;只要通信的两端都有Python(被 pickle的对象昰用Python专有的格式表达的而不是用XML文本)。 

    典型的使用情况是pickle对象到无格式文件,我们只需以写模式打开文件并调用dump函数: 

    注意这个被pickle对象中的嵌套:pickler可以处理任意结构。然后在另一个会话或程序中unpickle,只要重新打开该文件并调用load: 

    unpickle所得的对象具有与原对象相同的值囷引用结构,但它位于不同的内存地址无论在同一进程或另一进程unpickle,都是这样用Python的话来说,unpickle后的对象是“==”关系但不是“is”关系: 

    為了让这一过程更简单,例19-1中的模块把pickle和unpickle调用封装在函数中在函数中同时还打开文件,并将对象的序列化存储在该文件中 

    现在,存储囷提取时只需调用这些模块函数;以下实例是个相当复杂的结构具有对同一嵌套对象的多重引用,该嵌套列表即第1个L,在文件中只会保存一次: 

    除 了内置的类型如以上例子中的列表,元组和字典类实例也可被pickle到类似文件的对象中。这提供了一个自然的方式来关联行為与存储的数据(类方法处 理实例的属性)并提供了一条简单的迁移路径(被存储的实例将自动获得模块文件中对类的更改)。以下是個简短的交互演示: 

    我们将与本章下面的shelve一起详细探讨这是如此工作的我们将会看到,虽然pickle模块可直接使用但它也是shelve和ZODB数据库的底层翻译引擎。 

    编译的代码对象;函数和类在pickle中只是记录了它们的名字以便后来重新导入和自动获取模块文件中的更改。 

    不遵守类可导入规則(class importability rule)的类实例(本章后面“Shelve文件”一节的尾部有更多相关内容) 

    用C编码的或依赖于瞬态的一些内置的和用户定义类型的实例(例如,咑开的文件对象无法pickle) 

    在最近的Python版本中,pickler推出了协议的概念:pickle数据的保存格式通过pickle调用时传入一个额外的参数,可指定所需的协议(泹unpickle调用不需要:协议是自动从已pickle的数据确定的): 

    Pickle 数据可以按文本协议或二进制协议产生默认情况下,存储协议是文本协议(也称为0号協议)在文本模式下,用来存储pickle对象的文件可以用文本模式 打开如上述的例子,并且pickle的数据是可打印的ASCII文本并且是可读的(这基本仩是对堆栈机实现的指示)。 

    其 他协议(1号和2号协议 )以二进制格式存储pickle数据并要求文件以二进制模式打开(例如:rb、wb)。1号协议是原始二进制格式;2号协议是Python 2.3增加的它改善了对新型类pickle的支持。二进制格式效率更高一点但它无法进行查看。旧的pickle调用有一个选项即bin参數,现已被 归入使用大于0的协议pickle模块还提供了一个HIGHEST_PROTOCOL变量,传入它可以自动选择最大的协议值 

    注意:如果您使用默认的文本协议,以后請务必以文本模式打开pickle文件在一些平台上,因为Windows的行尾格式不同以二进制模式打开文本数据可能会导致unpickle错误: 

    回避这个潜在问题的方法の一是,总是使用二进制模式的文件即使是用文本pickle协议。至少对于二进制pickler协议(高于默认0)您必须以二进制模式打开文件,所以这不昰一个坏习惯: 

    请参考Python库手册以了解更多pickler的信息。另外请查阅marshal,它也是一个序列化对象的模块但只能处理简单对象类型。pickle比marshal更通用并通常是首选。 

    而 当你翻看(或点击)Python手册时请一定也要看看cPickle模块的条目,它是pickle的实现性能上更快。您可以显式导入 cPickle替代pickle以大幅提升速度;其主要的限制是,你不能继承该版本的Pickle和Unpickle因为它们是函数,而不是类(多数 程序并不要求它们是类)pickle和cPickle模块使用兼容的数據格式,所以它们可以互换使用 

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信