注意:我还没有接受答案,因为我的真正问题是为什么这会被标记为编译错误。我已经投了@TorelTwiddler的答案,因为他给了一个解决方法,但我想了解这个问题。
我有一个包含自测代码的简单模块。为了便于在交互式会话中使用,自测代码重新加载自身(模块)。
这在PyDev(RunAs)中运行正常并在交互式窗口中运行(在手动修改sys.path
和导入之后);但是PyDev IDE仍然在行上发出'compile'/ red-X错误
import Mod1
I import Mod1
本身的原因是该名称必须可以在运行Test()
的任何上下文中解析,以便重新加载成功。例如,如果从新的交互式窗口导入MyMain
,则对reload
的调用将失败而不导入,因为名称Mod1未知。
有什么方法可以解决这个问题吗? Mod1
是一个更大项目的一部分,并且一直标记为不编译会使开发变得更加困难......
有问题的模块:
# Mod1.py
def Test():
"""
run the self-test, but first force a reload of the module under test (this mod)
"""
import Mod1 # *****'COMPILE' ERROR HERE******
import imp
Mod1 = imp.reload(Mod1)
TestImpl()
def TestImpl():
"""
self test here
since I reload above, I can change this code and re-run from an interactive window
this has to be a seperate function for the reload in Test to have an effect on this code
"""
print(input("enter"))
仅在PyDev中使用的额外引导模块(因此我可以'run-as')
# MyMain.py
import Mod1
Mod1.Test()
PyDev / Project PYTHONPATH(显示正确,此文件夹位于我工作区的根目录)。既然它确实在PyDev OK中运行,那肯定是正确的吗?
/MyDirectory
谢谢!
答案 0 :(得分:2)
如果你在自己内部重新加载一个模块,你会创建一个无限循环,因为你只需重新加载模块再次重新加载模块,等等......
在您的MyMain.py
中,您可以这样做:
import Mod1
reload(Mod1)
Mod1.Test()
我想如果没有进一步的代码示例,很难准确评估为什么必须重新加载模块,但如果必须,那应该可以工作(不在模块中执行)
答案 1 :(得分:2)
我可能会选择Snaxib的答案,但是如果您希望保留当前格式,可以让Eclipse通过在行末添加#@UnresoledImport
来忽略错误(按Ctrl-1自动填写它。)
答案 2 :(得分:2)
在Snaxib答案的讨论中添加一个单独的答案,用于格式化。
让一个不会更改的模块TestMyStuff
以及您根据更改TheTest
更新的另一个模块。
#TestMyStuff.py
def go():
import TheTest
reload(TheTest)
TheTest.runTest()
和
#TheTest.py
def runTest():
#run my tests and change things often here.
print(input("enter"))
现在,从iteractive shell开始,您应该能够运行TestMyStuff.go()
,每次运行时都会TheTest
重新加载。
答案 3 :(得分:1)
我选择了#@ UnresolvedImport 注释,告诉PySide忽略它。在我的情况下,没有真正的解决方法,因为当使用pickle(我通过yaml间接使用它)时,正确的导入路径取决于模块的加载方式。如果你想从一个模块外部取消一个物体,那么如果从里面进行酸洗就不会起作用。自我导入为您提供了这种可能性。