2016-09-29 124 views
0

我有两个所谓的相同的系统。在两个系统上,我都运行相同的软件,但在其中一个上,它不能正常工作。imp.load_source加载错误的模块

我试图在用户提供的.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+。

有人能帮我找出这里发生了什么吗?我不知道要寻找什么......

+0

如果您查看两个系统上“module .__ file__”的值,您会得到什么结果? – BrenBarn

+0

对于两个系统'module .__ file__'都是'test_scriptsc'。 – Ludo

回答

0

它失败的原因是因为我做错了。 load_source的第二个参数应该是源文件的完整路径,而不仅仅是包含它的目录Python 2.7.12 documentation。 我不知道为什么我来到了我的实现,我也不知道为什么Python的2.7.11是接受也无妨,但解决的办法是做正确的方式:

​​

这正确,得出:

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

我认为该文件是test_scriptsc字节编译.py文件的尝试,但因为我没有给出完整的路径,我结束了东西,是编译整理的-目录。显然,Python 2.7.11与Python 2.7.12的处理方式不同。

相关问题