奇怪的python搜索路径行为,这里出了什么问题?

时间:2010-11-04 18:14:32

标签: python windows excel

我们在Windows XP 32bit上有一个基于Excel 2003和Python 2.4的应用程序。该应用程序包含大量Python函数,可以从许多excel工作表中调用。

我们已经注意到一个异常的行为,即有时在其中一个调用的中间,python解释器将开始寻找几乎肯定已经加载并在内存中的模块。

我们知道这是因为我们能够将Sysinternal的进程监视器连接到进程并观察到有时进程(被调用时)开始在一堆目录和鸡蛋周围寻找某些.py文件。

显而易见的尝试是查看python搜索路径是否已被修改,但我们发现情况并非如此。这正是我们所期望的。奇怪的是:

  • 触发此搜索行为的时机似乎是随机的,即每次都不会发生或以任何明显的模式发生。

  • 该行为不会影响该功能的结果。无论是否触发了此文件搜索行为,它都返回相同的值。

  • 正在扫描的文件夹在J-drive包含无此文件夹的计算机上不存在(例如J:/ python-eggs)。自然地宣告这会产生一个未找到文件的错误。

这一切都非常神秘,所以我不希望任何人能够就可能出现的问题提供明确的答案。我很感激有关如何调试此问题的任何建议。

谢谢!

评论回答

  1. 正在搜索的所有内容都是实际的,已知的python文件,它们存在于主项目.egg文件中。奇怪的是,当他们被搜索时 - 这些特定模块已经已经被导入。它们必须在内存中才能使过程正常工作。

  2. 是的,这会影响性能,因为有时此搜索行为会尝试触及网络驱动器。此外,通过搜索不可能包含某些模块的鸡蛋,该过程会被公司强制要求的病毒扫描程序中断。这会减慢通常无害和即时中断的速度。

  3. 这是股票python 2.4.4。没有修改。

2 个答案:

答案 0 :(得分:2)

Python程序可以随时导入模块,而不仅仅是在程序加载期间。尝试搜索您用于import的模块。

如果这不起作用,您可以编写一个导入钩子来捕获并报告所有尝试的导入。例如,如果您在其他所有操作之前运行此操作,您将获得每次尝试导入及其来源的转储:

import sys, traceback

class ImportDebugger:
    def find_module(self, fullname, path=None):
        print "Attempting to import %s:" % fullname
        traceback.print_stack()

sys.meta_path.insert(0, ImportDebugger())

答案 1 :(得分:1)

  

“可以从许多excel工作表中调用的Python函数”

你是不是因为随机运行Python模块而责怪Excel?为什么不?你是如何证明Excel表现正常的?