代码之家  ›  专栏  ›  技术社区  ›  Salim Fadhley

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

  •  3
  • Salim Fadhley  · 技术社区  · 15 年前

    我们有一个基于Excel2003和Python2.4的Windowsxp32bit应用程序。该应用程序包含大量的python函数集合,可以从许多Excel工作表中调用这些函数。

    我们还没有发现异常行为,即有时在其中一个调用的中间,Python解释器将开始寻找几乎可以肯定已经加载并在内存中的模块。

    我们之所以知道这一点,是因为我们能够将SysInternal的进程监视器连接到该进程,并观察到该进程(当被调用时)不时地围绕一堆目录和鸡蛋搜索特定的.py文件。

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

    • 这种搜索行为被触发的情况似乎是随机的,也就是说,它不是每次都发生,也不是以任何明显的模式发生。

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

    • 正在扫描的文件夹在J-Drive不包含此类文件夹的计算机上是不存在的(例如j:/python eggs)。当然,procmon报告这生成了一个“找不到文件”错误。

    这一切都非常神秘,所以我不希望任何人能够就可能发生的问题提供明确的答案。对于如何调试这个问题的任何建议,我将不胜感激。

    谢谢!

    对评论的回答

    1. 搜索的所有内容都是存在于主项目.egg文件中的已知python文件。奇怪的是,在搜索这些粒子模块时 已经 已导入。它们必须在内存中才能使进程工作。

    2. 是的,这会影响性能,因为有时这种搜索行为会尝试攻击网络驱动器。此外,通过搜索不可能包含某些模块的鸡蛋,该过程会被公司授权的病毒扫描程序中断。这会减慢正常情况下无害且即时中断的速度。

    3. 这是stock python 2.4.4。没有修改。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Robie Basak    15 年前

    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())
    
        2
  •  1
  •   S.Lott    15 年前

    “可以从许多Excel工作表调用的python函数”

    你不怪Excel随机运行python模块吗?为什么不?您如何证明Excel的行为正常?