在Python中导入问题

时间:2009-09-15 15:24:21

标签: python import

[结束语] 谢谢大家试图帮助我。

我发现了问题,它与我对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

这是什么问题?我该怎么办?

编辑:谢谢你的答案我还有问题。 :( 当我将import语句更改为:

from SomeUtils import funct1
from SomeUtils import MyClass1

我有这个错误

ImportError: cannot import name MyClass1

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

谢谢你们。

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

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

这是dir结构。 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”,它可以正常工作。

如果我使用“来自XWinInfos import *;”,则错误为“NameError:全局名称'XWinInfo'未定义”。

如果我使用“来自XWinInfos import XWinInfo;”,则错误为“ImportError:无法导入名称XWinInfo”。

请帮助。 提前谢谢。

5 个答案:

答案 0 :(得分: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()

[编辑基于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代码,所以我只是删除了依赖该文件的方法。使用存根方法并纠正上述拼写错误,您发布的代码现在可以使用。

答案 1 :(得分:2)

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

修改:您的错误

  

ImportError:无法导入名称MyClass1

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

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

答案 2 :(得分:1)

您可能需要重写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 *因此而气馁 污染全局命名空间

答案 3 :(得分: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()

答案 4 :(得分:0)

你的问题自然与很多旧的问题有关。 请参阅SO1342128SO1057843

,仅供参考