imp.load_source加载错误的模块

时间:2016-09-29 07:07:02

标签: python python-2.7 python-import

我有两个相同的系统。在这两个系统上,我运行相同的软件,但在其中一个软件上运行不正常。

我试图在用户提供的.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未正确更新。但是,我不明白为什么,也不理解为什么问题只出现在两个系统中的一个上。我可以在两个系统之间找到的唯一区别是,有问题的系统在Ubuntu Linux 16.04.1上运行Python Python 2.7.12,而没有问题的系统在Ubuntu 16.04上运行Python 2.7.11+。

有人可以帮我找出这里发生了什么吗?我不知道该找什么......

1 个答案:

答案 0 :(得分:0)

失败的原因是因为我做错了。 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不同。