【问题标题】:Problem with import in PythonPython中的导入问题
【发布时间】:2009-09-15 15:24:20
【问题描述】:

[结束注] 感谢所有试图帮助我的人。

我发现了问题,这与我对python的理解无关(很少)。 :p

问题是我编辑了同一个项目的错误分支,Main.py在一个分支,XWinInfos.py在另一个分支。

还是谢谢。

[原问题] 我是一名 Java/PHP/Delphi 程序员,只在破解别人的程序时才使用 Python——从不自己编写复杂的 Python。由于这周我的空闲时间很短,我决定用 Python 写一些非琐事,这就是我的问题

首先我有这样的 python 文件:

src/
    main.py
    SomeUtils.py

在“SomeUtils.py中,我有几个函数和一个类:

...
def funct1 ...

def funct2 ...

class MyClass1:
    __init__(self):
        self. ....
...

然后在“main.py”中,我使用函数和类:

from SomeUtils import *;

def main():
    funct1();               # Use funct1   without problem;
    aMyObj1 = MyClass1();   # Use MyClass1 with error

if (__name__ == "__main__"):
    main();

问题是函数的使用没有任何问题,但我无法使用该类。

错误是:

NameError: global name 'MyClass1' is not defined

这里有什么问题?我能做什么?

编辑:感谢您的回答,我仍然有问题。 :( 当我将导入语句更改为:

from SomeUtils import funct1
from SomeUtils import MyClass1

我有这个错误

ImportError: cannot import name MyClass1

编辑 2:----------------------------- -----------------

谢谢你们。

我认为,发布实际代码可能会更好,所以在这里:

注意:我知道“;”和 "(...)" 但我喜欢这样。

这里是目录结构。 DIRS http://dl.getdropbox.com/u/1961549/images/Python_import_prolem_dir_.png 如您所见,我只是添加了一个空的 init.py,但似乎没有什么不同。

这里是 main.py:


from XWinInfos import GetCurrentWindowTitle;
from XWinInfos import XWinInfo;

def main():
    print GetCurrentWindowTitle();
    aXWinInfo = XWinInfo();

if (__name__ == "__main__"):
    main();

这里是 XWinInfos.py:

from subprocess import Popen;
from subprocess import PIPE;
from RegExUtils import GetTail_ofLine_withPrefix;

def GetCurrentWindowID():
    aXProp = Popen(["xprop", "-root"], stdout=PIPE).communicate()[0];
    aLine  = GetTail_ofLine_withPrefix("_NET_ACTIVE_WINDOW\(WINDOW\): window id # 0x", aXProp);
    return aLine;

def GetCurrentWindowTitle():
    aWinID    = GetCurrentWindowID(); 
    aWinTitle = GetWindowTitle(aWinID);
    return aWinTitle;

def GetWindowTitle(pWinID):
    if (aWinID == None): return None

    aWMCtrlList = Popen(["wmctrl", "-l"], stdout=PIPE).communicate()[0]; 
    aWinTitle   = GetTail_ofLine_withPrefix("0x[0-9a-fA-F]*" + aWinID + "[ ]+[\-]?[0-9]+[ ]+[^\ ]+[ ]+", aWMCtrlList);
    return aWinTitle;

class XWinInfo:
    def __init__(self):
        aWinID = GetCurrentWindowID();
        self.WinID = pWinID;
        self.Title = GetWindowTitle(pWinID);

文件 RegExUtils.py 包含一个函数“GetTail_ofLine_withPrefix”,可以正常工作。

如果我使用“from XWinInfos import *;”,则会出现错误“NameError: global name 'XWinInfo' is not defined”。

如果我使用“from XWinInfos import XWinInfo;”,则会出现错误“ImportError: cannot import name XWinInfo”。

请帮忙。 提前致谢。

【问题讨论】:

  • 该行是否应该读作“from SomeUtils import *”?
  • 你能在这里发布实际代码吗?什么是“从 XWinInfos 导入 *”?不应该是“SomeUtils”吗?你的 Python 路径是什么样的? “src/”中是否有“init.py”?而且:Python不需要那些花哨的“;”在每一行的末尾。你应该放弃它们......
  • 是的,应该是“SomeUtils”,不,没有init.py。我应该创建它吗?里面应该有什么?
  • 也可以为空但必须存在
  • 我已经发布了实际代码,请看一下(“EDIT 2”)。

标签: python import


【解决方案1】:

嗯...您的示例中有几个拼写错误,所以我想知道您的实际代码是否也有一些拼写错误。这是一个快速测试的完整源代码,它可以正常工作而不会出现导入错误。

SomeUtils.py:

def funct1():
    print('Function 1')

def funct2():
    print('Function 2')

class MyClass1(object):
    def __init__(self):
        print('MyClass')

main.py:

from SomeUtils import *

def main():
    funct1()
    aObj = MyClass1()

if (__name__ == "__main__"):
    main()

[编辑基于 OP 附加信息]

我仍然无法重新创建相同的错误,但您发布的代码最初无法解决 XWinInfox.py init 方法中的至少几个错误:

self.WinID = pWinID #change to 'aWinID' since pWinID is not defined
self.Title = GetWindowTitle(pWinID)  #change to 'aWinID'since pWinID is not defined

所以一个更正的版本应该是:

self.WinID = aWinID
self.Title = GetWindowTitle(aWinID)

另外,您的 init 文件名中有错字,“init”字之前和之后应该有两个下划线。现在你有'__init_.py',它应该是'__init__.py',但这不应该阻止你的代码工作。

因为我没有 RegExUtils.py 代码,所以我只是删除了依赖该文件的方法。使用存根方法并更正上述拼写错误,您发布的代码现在可以正常工作了。

【讨论】:

    【解决方案2】:

    为什么要从XWinInfos 导入?你应该从SomeUtils 导入。更不用说不鼓励 * 样式的导入。

    编辑:你的错误

    ImportError: 无法导入名称 MyClass1

    基本上告诉你SomeUtils中没有定义MyClass1。这可能是因为您在系统路径的某处有另一个 SomeUtils.py 文件,而它被导入了。如果该文件没有MyClass1,您会收到此错误。

    再次声明:你的班级MyClass1是否存在无关紧要。可能的情况是您的系统上某处有另一个XWinInfos.p(y|o|w),并且它正在被导入。否则:norepro

    【讨论】:

    • 感谢发帖。 XWinInfos 是一个输入错误,所以它应该是 SomeUtils。问题仍然存在,并显示相同的错误消息。
    • 编辑后:再次感谢。我确信 MyClass1 存在(复制粘贴)。如果它导入另一个模块,funct1如何工作。
    【解决方案3】:

    你可能想重写 main.py 如下:

    import SomeUtils as util
    
    def main():
        util.funct1()               # Use funct1   without problem;
        aMyObj1 = util.MyClass1()   # Use MyClass1 with error
    
    if __name__ == "__main__":
        main()
    

    一些快速说明:

    • 中不需要分号 Python 除非你有不止一个 一行语句
    • 没有必要 将条件测试包装在 除分组外的括号
    • from module import * 不鼓励,因为它 污染全局命名空间

    【讨论】:

    • 抱歉输入错误,我更改名称是为了分散实际问题的注意力(但这里似乎是一个错误)。无论如何,当我将导入部分更改为:“from SomeUtils import funct1”和“from SomeUtils import MyClass1”时。我有这个错误“ImportError:无法导入名称 MyClass1”。
    【解决方案4】:

    我想你的意思是

    from SomeUtils import *
    

    但是,这不会触发我的错误。这对我来说很好:

    SomeUtils.py

    def funct1():
        print 4
    
    class MyClass1:
        def __init__(self):
            print 8
    

    main.py

    from SomeUtils import *
    
    def main():
        funct1()               # Use funct1   without problem;
        aMyObj1 = MyClass1()   # Use MyClass1 without error
    
    if (__name__ == "__main__"):
        main()
    

    【讨论】:

    • 你对我的错误类型是正确的,但我确实对班级有问题。
    【解决方案5】:

    您的问题自然与很多老问题有关。 请参阅SO1342128SO1057843,仅供参考

    【讨论】:

    • 与这个问题完全无关
    猜你喜欢
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多