python 调试,找出设置变量的位置

python debugging, and finding out where variables get set

我正在修改位于此处的维基百科 python 模块: https://pypi.python.org/pypi/wikipedia/

实际上,我希望能够将它指向另一个基于维基媒体的站点,该站点也支持相同的 API 调用(这很常见)。

在该包的 wikipedia.py 中定义了一个全局变量,稍后针对语言域进行了更新,您可以在此处查看详细信息:

https://github.com/goldsmith/Wikipedia/blob/master/wikipedia/wikipedia.py

这是有趣的部分:

如果我修改 wikipedia.py(我将 pip 安装到站点包中)以完全更改 API_URL,它仍然会以某种方式设置为旧值。

使用 pdb 逐步执行代码,它发生在正则表达式导入之后,这让我觉得新代码不是 'sticking' 或正在发生。我试过删除已编译的 python pyc 文件,但无济于事。

在交互模式下启动python,导入维基百科,然后查看API_URL的值,这不是我设置的值。我一定是遗漏了一些明显的东西,这让我很烦恼。

Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import wikipedia
>>> wikipedia.API_URL
u'http://en.wikipedia.org/w/api.php'

这里还有一些我不明白的地方。

是否有必要将 'u' 作为字符串的一部分包含在内?为什么在运行时设置变量对这两种情况都不起作用(包括 u 或不)。我意识到 u 表示 unicode,但我不确定在我手动设置变量时是否应该设置它,或者是否需要它。

Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import wikipedia
>>> wikipedia.API_URL
u'http://en.wikipedia.org/w/api.php'
>>> wikipedia.API_URL = 'http://example.com/w/api.php'
>>> wikipedia.search("Barack")
[u'Barak (given name)', u'Barack Obama', u'Inauguration of Barack Obama', u'First inauguration of Barack Obama', u'Nationwide opinion polling for the United States presidential election, 2012', u'Barack Obama Presidential Center', u'Political positions of Barack Obama', u'Barack (disambiguation)', u'Statewide opinion polling for the United States presidential election, 2008', u'Barack Obama presidential campaign endorsements']
>>> wikipedia.API_URL = u'http://example.com/w/api.php'
>>> wikipedia.search("Barack")
[u'Barak (given name)', u'Barack Obama', u'Inauguration of Barack Obama', u'First inauguration of Barack Obama', u'Nationwide opinion polling for the United States presidential election, 2012', u'Barack Obama Presidential Center', u'Political positions of Barack Obama', u'Barack (disambiguation)', u'Statewide opinion polling for the United States presidential election, 2008', u'Barack Obama presidential campaign endorsements']

编辑:天哪,这太尴尬了。我忘记了我最初是从 github 下载包的,而那个版本实际上是默认导入的,因为它与我正在处理的项目位于同一目录中。哎呀。

print wikipedia.file 显示了一个相对路径,我原以为它位于 site-packages 目录中。错误的假设!

如果 print wikipedia.__file__ 给了您要查找的文件名,为什么不在导入后直接设置 API_URL

import wikipedia
wikipedia.API_URL = "http://de.wikipedia.org/w/api.php"

编辑: 我忘了提及,因为我发现这很明显:在 wikipedia.py 和其他文件中搜索 API_URL。您会注意到它是在 set_lang() 中设置的,因此所有调用都会覆盖您的手动设置。您可能只想使用 set_lang(your_domain)!