我有两个相同的系统。在这两个系统上,我运行相同的软件,但在其中一个软件上运行不正常。
我试图在用户提供的.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 :(得分: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不同。