Python导入问题

0 投票
5 回答
2811 浏览
提问于 2025-04-15 14: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:----------------------------------------------------------

谢谢你们。

我想,发布实际代码可能更好,所以这里是:

注意:我知道“;”和“(...)”的用法,但我喜欢这样写。

这是目录结构。 目录 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”。

请帮帮我。 提前谢谢你们。

5 个回答

1

我猜你是指

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()
2

你为什么要从 XWinInfos 导入呢?你应该从 SomeUtils 导入。更重要的是,使用 * 这种方式导入是不推荐的。

编辑:你的错误

ImportError: cannot import name MyClass1

这个错误基本上告诉你,在 SomeUtils 里没有定义 MyClass1。可能是因为你系统路径上有另一个 SomeUtils.py 文件被导入了。如果那个文件里没有 MyClass1,你就会看到这个错误。

再说一遍:MyClass1 类是否存在并不重要。可能的情况是你系统上有另一个 XWinInfos.p(y|o|w) 文件被导入了。否则的话:无法重现

3

嗯……你这个例子里有几个拼写错误,我在想你的实际代码里是不是也有类似的错误。这里有一段完整的代码,经过快速测试,运行得很好,没有导入错误。

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()

[编辑 根据提问者的补充信息]

我还是无法重现你说的错误,不过你发的代码在 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 的代码,所以我只是简单地写了依赖于那个文件的方法的占位符。经过这些占位符的方法和修正之前提到的拼写错误后,你现在发的代码可以正常工作了。

撰写回答