在Python中使用Twill打开链接时:“模块”对象没有属性“Popen”,这是怎么回事?

1 投票
3 回答
1978 浏览
提问于 2025-04-16 03:36

我在我的电脑上下载并安装了Python 2.5.4(我的操作系统是Windows XP),还下载了“谷歌应用引擎软件开发工具包”,并创建了我的第一个Python应用程序,这个应用程序的目录叫helloworld,里面有一个同名的小Python文件(helloworld.py)。这个小文件的内容如下:


print 'Content-Type: text/plain'
print ''
print 'Hello, world!' 

每当我在电脑上用“谷歌应用引擎软件开发工具包”运行这个应用时,我的浏览器(FireFox)总是显示一个白色窗口,里面写着Hello, world!

然后我下载了Twill并将它解压到helloworld目录里。在正确安装Twill后,我能够在Twill的命令行中执行一些小命令。例如,我可以通过某个链接打开一个网页:

alt text

接着我想直接通过Python来执行同样的操作(也就是通过Python使用Twill)。以下是Twill文档页面上关于这方面的说明:


twill的Python API

使用TwillBrowser进行扩展

twill本质上是一个围绕mechanize包的薄壳。所有twill命令都在commands.py文件中实现,pyparsing负责解析输入并将其转换为Python命令(见parse.py)。交互式命令行工作和readline支持是通过cmd模块(来自标准Python库)实现的。

从Python使用twill

有两种相对简单的方法可以从Python使用twill。(它们是兼容的,所以你不需要在它们之间选择;只需使用适合你的方法。)

第一种方法是简单地导入commands.py中的所有命令,并直接在Python中使用它们。例如:

from twill.commands import *
go("http://www.python.org/")
showforms()

这种方法的优点是非常简单,并且与命令参考中的文档命令直接相关。


所以我决定使用这种方法。我删除了helloworld.py之前的内容,并给它添加了新的内容:


from twill.commands import *
go("http://www.python.org/")
showforms()

但是当我尝试在我的电脑上用“谷歌应用引擎软件开发工具包”运行这个文件时,我的浏览器没有显示www.python.org网站的内容,而是给了我一个错误信息:'module' object has no attribute 'Popen'

alt text

请查看整个页面这里

以下是该页面的最后三行:


: 'module' object has no attribute 'Popen'

  args = ("'module' object has no attribute 'Popen'",)

  message = "'module' object has no attribute 'Popen'" 

有没有人能告诉我这个Popen属性是怎么回事,我哪里做错了?

谢谢大家!


更新 1

(这个更新是我对下面leoluk提供的第二个回答的回应)

你好,leoluk!!!

我尝试这样做:

config use_tidy 0
from twill.commands import *
go("http://www.python.org/")

但是没有成功。我收到了这个错误信息:

<type 'exceptions.SyntaxError'>: invalid syntax (helloworld.py, line 1)
      args = ('invalid syntax', (r'E:\helloworld\helloworld.py', 1, 15, 'config use_tidy 0\n'))
      filename = r'E:\helloworld\helloworld.py'
      lineno = 1
      message = ''
      msg = 'invalid syntax'
      offset = 15
      print_file_and_line = None
      text = 'config use_tidy 0\n'

(你可以在这里查看整个页面)

你知道这是什么意思,哪里出错了吗?

3 个回答

2

我觉得你应该直接使用 mechanize。因为 Twill 和系统的沟通方式不被 Google App Engine 支持。

import mechanize

browser = mechanize.Browser()

browser.open('http://www.python.org')

for f in browser.forms():
    print f # you'll have to extend it
2

在Google App Engine上,你不能使用任何东西。Twill使用了一些在Google App Engine上无法使用的东西,所以它在这个平台上并不完全支持。

特别是,代码试图调用一个外部命令,叫做tidy,而在App Engine上调用外部命令是行不通的。

2

tidy这个程序能很好地把那些乱七八糟、坏掉的网页变成正确的HTML代码。默认情况下,twill会在处理网页之前先用tidy处理一下。这是默认设置,因为用来解析HTML的Python库在处理不正确的HTML时表现得很糟糕,常常会在“真实世界”的网页上返回错误的结果。

如果你想关闭这个功能,可以把配置项do_run_tidy设置为0。

撰写回答