imp.load_source 加载了错误的模块

imp.load_source loads wrong module

我有两个假定相同的系统。在这两个系统上,我 运行 使用相同的软件,但在其中一个系统上无法正常运行。

我正在尝试 运行 在用户提供的 .py 文件中运行。我已将其简化为以下重现错误的基本代码:

import imp
with open("test_scripts/load_offsets.py") as fp:
    module = imp.load_source("load_offsets", "test_scripts", fp)

dir(module)

在第一个系统上,输出是正确的:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'test_load_offsets']

正如预期的那样,我看到一个名为 test_load_offsets 的函数。

在第二个系统上,我得到以下输出:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'test_reset_position']

请注意,我现在看到一个不同的函数:test_reset_position。但是,在两个系统上,文件 test_scripts/load_offsets.py 是相同的!更重要的是,这个文件中没有函数test_reset_position

但是,在另一个文件中有一个函数test_reset_position,即test_scripts/reset_position.py。另外,在我执行代码示例的目录中,有一个文件test_scriptsc(两个系统都是这样)。我认为它包含字节代码,但在我看到问题的系统上,我可以识别其中的文件 test_scripts/test_reset_position.py 的部分内容。如果我删除 test_scriptsc,它会再次正常工作,直到加载不同的文件然后问题再次出现。

所以,我的结论是在有问题的系统上,文件 test_scriptsc 没有正确更新。但是,我不明白为什么,也不明白为什么问题只出现在两个系统之一上。我能在这两个系统之间找到的唯一区别是有问题的系统 运行s Python Python 2.7.12 on Ubuntu Linux 16.04.1 而系统没有问题 运行s Python 2.7.11+ on Ubuntu 16.04.

谁能帮我看看这是怎么回事?我不知道要找什么...

失败的原因是我做错了。 load_source 的第二个参数应该是源文件的完整路径,而不仅仅是包含它的目录 Python 2.7.12 documentation。 我不确定我为什么想出我的实现,我也不知道为什么 Python 2.7.11 无论如何都会接受它,但解决方案是以正确的方式进行:

with open("test_scripts/load_offsets.py") as fp:
    m = imp.load_module("load_offsets", fp, "test_scripts/load_offsets.py", ("py","r",imp.PY_SOURCE))

dir(m)

正确给出:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'test_load_offsets']

我认为文件 test_scriptsc 是对 .py 文件进行字节编译的尝试,但由于我没有给出完整路径,所以我最终得到了一些类似的东西- 编译目录。显然 Python 2.7.11 与 Python 2.7.12.

的处理方式不同