pydev - ide抱怨模块导入自身

时间:2011-10-14 16:08:26

标签: python pydev

注意:我还没有接受答案,因为我的真正问题是为什么这会被标记为编译错误。我已经投了@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

谢谢!

4 个答案:

答案 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间接使用它)时,正确的导入路径取决于模块的加载方式。如果你想从一个模块外部取消一个物体,那么如果从里面进行酸洗就不会起作用。自我导入为您提供了这种可能性。