冲击加载源加载错误的modu

2024-03-28 23:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个假设相同的系统。在两个系统上,我运行的是同一个软件,但在两个系统中的一个不能正常工作。在

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

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

dir(module)

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

^{pr2}$

我看到了一个名为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_scriptsc(这两个系统都是这样)。我认为它包含字节码,但在我看到问题的系统上,我可以识别出文件test_scripts/test_reset_position.py的部分内容。如果我删除test_scriptsc,它会再次正常工作,直到加载另一个文件,然后问题再次出现。在

因此,我的结论是,在有问题的系统上,test_scriptsc文件没有正确更新。但是,我不明白为什么,也不明白为什么问题只出现在两个系统中的一个。我发现这两个系统之间的唯一区别是,有问题的系统在UbuntuLinux16.04.1上运行PythonPython2.7.12,而没有问题的系统在Ubuntu16.04上运行Python2.7.11+。在

有人能帮我弄清楚这是怎么回事吗?我不知道该找什么。。。在


Tags: 文件函数代码pytest系统scriptsposition
1条回答
网友
1楼 · 发布于 2024-03-28 23:35:56

失败的原因是我做错了。load_source的第二个参数应该是源文件的完整路径,而不仅仅是指向包含它的目录{a1}。 我不知道我为什么要提出我的实现,也不知道Python2.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)

这正确地给出了:

^{pr2}$

我认为文件test_scriptsc是字节编译.py文件的一种尝试,但是由于我没有给出完整的路径,我最终得到了某种编译目录。显然,Python2.7.11处理这一问题的方式与Python2.7.12不同。在

相关问题 更多 >