可爱的Python:动态重新装入

与大多数其它编程语言相比,Python 的一大优点就是其强大的运行时动态能力。感谢方便的 reload() 函数,我们可以编写持续运行的程序,但它可以在进程运行期间装入经过修改的组件(对于那些持续运行时间至关重要的服务来说, 相当有用)。b本文在 David 以前的文章中讨论的对 Txt2Html 前端的某些增强基础上,说明了运行时程序修改。特别是,我们的样本程序将对因特网上 Txt2Html 转换库的新版本进行后台检查, 并下载和重新装入所需的新版本,无需用户手工介入。

让我们描绘一下本文的情节:假设您要在本地机器上运行一个进程,而部分程序逻辑却在另一处。让我们特别假设这个程序逻辑会不时更新, 而您运行进程时,希望使用最新的程序逻辑。有许多方法可以满足刚提到的要求;本文将向您说明其中几种方法。

随着“可爱的 Python”专栏不断进行,已经讨论了我的公共域实用程序 Txt2Html 的正在进行的增强。该实用程序将“智能 ASCII”文本文件转换成 HTML。以前的文章讨论了实用程序的 Web 代理版本和实用程序的 curses 界面。同样,我偶尔注意到可以用更有效的方法转换某些 ASCII 标记,或者解决了一个在处理某个特殊标记结构中的错误。

事实上,本专栏的文章都是用 ASCII 编写的,然后在编辑过程中转换成您可以阅读的 HTML 格式。在发表文章草稿之前,我运行了类似以下处理的程序:

文章的命令行 HTML 化

txt2html charming_python_7.txt > charming_python_7.html

如果愿意,我可以指定一些标志来修改操作;但不管怎样,事实上转换器的最新版本在我的本地驱动器和路径中。如果在另一台机器上工作,或者对于要使用该实用程序的读者,则过程比较麻烦:请访问我的网站,注意比较版本号和文件日期(有时更改太小,我不会更改版本号),下载当前版本、将当前版本复制到正确目录,然后运行命令行转换器。(请参阅本文后面的 参考资料。)

以上的过程包括几个需要手工操作且比较费时的步骤。应该更简单,而且可以做到这点。

命令行 Web 访问

大多数人认为 Web 是在 GUI 环境中交互式浏览页面的一种方法。那样做当然很好,但命令行中也有许多功能。带文本模式 Web 浏览器 lynx 的系统完全可以将整个 Web 看作是命令行工具使用的另一个文件集。例如,我发现有些命令很有用:

使用 lynx 进行命令行 Web 浏览

lynx -dump http://gnosis.cx/publish/.
lynx -dump http://ibm.com/developerworks/. > ibm_developer.txt
lynx -dump http://gnosis.cx/publish | wc | sed "s/( *[0-9]* *\)\([0-9]*\)\(.*\)/\2/g"

第一行说:“将 David Mertz 的主页(以 ASCII 文本)显示到控制台。”第二行说:“将 IBM 的当前 developerWorks 主页的 ASCII 版本保存到文件。”第三行示例说:“显示 David 主页的字数。”(不必担心细节,它只显示与管道结合的命令行工具。)

关于 lynx,有一点要注意它(使用 -dump 选项时)执行几乎与 Txt2Html 完全相反的操作:前一种工具将 HTML 转换成文本;而后一种工具则转换成其它格式。但没有理由不使用与 lynx 一样流行的 Txt2Html。可以使用一个很短的 Python 脚本完成这个操作:

'fetch_txt2html.py' 命令行转换器

import sys
from urllib import urlopen, urlencode
if len(sys.argv) == 2:
  cgi = 'http://gnosis.cx/cgi/txt2html.cgi'
  opts = urlencode({'source':sys.argv[1], 'proxy':'NONE'})
  print urlopen(cgi, opts).read()
       else:
  print "Please specify URL for Txt2Html conversion"

要运行这个脚本,只要执行如下操作:

python fetch_txt2html.py http://gnosis.cx/publish/programming/charming_python_7.txt

这并没有向您提供本地 Txt2Html 处理的全部开关,但如有必要,添加它们也很容易。可以像使用任何命令行工具一样来输送和重定向输出。但是,在上述版本中,只能处理 URL 可以到达的数据文件,而不能处理本地文件。

实际上, fetch_txt2html.py 可以完成 lynx 不能完成的任务(Txt2Html 本身也不能):它不仅从 URL 取得数据源,而且还远程获取 程序逻辑 。如果使用 fetch_txt2html.py ,就 不必在本地机器上安装 Txt2Html;将(使用最新版本)远程调用处理,并且将把结果发送回来,就像运行的是本地进程。很棒吧?Txt2Html 的本地版本可以访问远程 URL,就像访问本地文件一样,但它还不能保证它自身是最新的……!

时间: 2024-09-05 17:26:07

可爱的Python:动态重新装入的相关文章

可爱的Python: 用基于生成器的状态机和协同程序增加效率

Python 2.2 中引进的简单生成器可用于简化状态机以及模仿协同程序.David 在"可爱的 Python"专栏较早前的一个部分中介绍了一个 状态机处理的抽象模式.从那时起,简单生成器的引进就为描述机器提供了一些更自然的范例.协同程序是一种"外来"流机制,广泛使用的语言几乎都不支持这种机制(甚至连非 Stackless Python 都不支持它).然而,Python 的新生成器 几乎完全支持协同程序,几乎不用模仿任何额外的步骤.在本文中,David 通过说明性代

可爱的Python:Decorator简化元编程

Python 使元编程成为可能,不过每个版本的 Python 都有一些细微的区别(并且不是完全兼容),这使我们实现元编程的道路变得更加崎岖.一类函数对象的使用由来已久,同样还有一些技术用于探索和实现魔术般的属性.在版本 2.2 中,Python 增加了一种很有帮助的定制元类机制,但是其代价就是令用户绞尽脑汁.最近,在 2.4 版本中,Python 增加了 "decorator" ,这是适于执行大部分元编程的最新方式 -- 也是到目前为止对用户最友好的方式. 少劳多得 Decorator

可爱的Python: 用Python生成器实现“轻便线程”

在 "可爱的 Python"的前面一部分中,David 介绍了一种用生成器和简单的调度程序模拟完整协同程序的方法.我们也许可以用直观的方式来扩展这种调度程序,使其允许对多进程使用极为轻量级的线程.与 Stackless Python 微线程非常相似,伪协同程序"轻便线程"几乎不需要 OS(甚至用户区)线程的上下文切换和内存开销.David 在这里介绍了轻便线程,一种巧妙的解决方案,它用来解决使用普通解决方案处理将涉及大量协同进程的问题. 微线程领域(至少在 Pyth

可爱的Python: 使用Spark模块解析

Spark 是一种用 Python 编写的强大的.通用的解析器/编译器框架.在某些方面,Spark 所提供的比 SimpleParse 或其它 Python 解析器提供的都要多.然而,因为它完全是用 Python 编写的,所以速度也会比较慢.David 在本文中讨论了 Spark 模块,给出了一些代码样本,解释了它的用途,并对其应用领域提供了一些建议. 继"可爱的 Python"系列中专门讲述 SimpleParse 的 前一篇文章之后,我将在本文中继续介绍一些解析的基本概念,并对 S

可爱的Python:将XML和Python结合起来

开始在 Python 中使用 XML 的一个主要要素是排列出所有可用模块的可比性能力.在他的新 Python 专栏"可爱的 Python"的第一部分中,David Mertz 简要描述了最流行和实用的关于 XML 的 Python 模块,并指出可以下载的单独模块以及可供阅读的参考资料.本文有助于确定哪些模块最适合特定任务. 在许多情况下,Python 是使用 XML 文档的理想语言.像 Perl.REBOL.REXX 和 TCL 一样,它是一种灵活的脚本语言,并且有强大的文本操作能力.

可爱的Python:Curses编程

某一类 Python应用程序最好使用交互式用户界面,这样可以消除图形环境的系统开销或复杂性.交互式文本模式程序(在Linux/UNIX 中),例如封装在 Python 的标准 curses模块中的 ncurses 库,正是您所需要的.本文中,DavidMertz 讨论了在 Python 中 curses 的用法.他使用从前端到 Txt2Html程序的样本源代码阐述了 curses 环境. curses 库 ( ncurses ) 提供了控制字符屏幕的独立于终端的方法.curses 是大多数类似于

可爱的Python: 重温Python的XML工具

David Mertz 创作的 可爱的 Python的第一.第二部分概述了在 Python 中使用XML.然而,在那些最初的文章出现后,Python 中的 XML工具有了很大的发展.不幸的是,这些改进中的大多数并不向后兼容.在这个特别部分中,重温了作者先前对XML 工具的讨论,并提供最新的代码示例. 在许多情况下,Python 是使用 XML 文档的理想语言.像 Perl.REBOL.REXX 和 TCL 一样,它是一种灵活的脚本语言,并且有强大的文本操作能力.而且,除了对多数类型的文本文件(或

python动态参数用法实例分析

  本文实例讲述了python动态参数用法.分享给大家供大家参考.具体分析如下: 先来看一段代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 class Person: def __init__(self,*pros,**attrs): self.name = "jeff" self.pros = pros for (key,value) in attrs.items(): stm = "self.%s = /"%s/""% (k

可爱的Python:Python中的TK编程

David Mertz 用源代码样本以及详细的说明介绍了 TK 和Tkinter 封装器(Python 的 GUI库).为了更便于操作,他演示了曾在以前很多文章中使用的 Txt2Html前端程序的 GUI移植示例.当然,他认为您会定期阅读其专栏. 我想要向您介绍能想像到的开始 GUI 编程的最简单方法,就是使用 Scriptics 的 TK 和 Tkinter 封装器.我们将与 developerWorks 中的 "Python 中的 curses 编程" 提到的 curses 库进行