Python中的导入问题

2024-09-29 21:24:04 发布

您现在位置:Python中文网/ 问答频道 /正文

[结束语] 谢谢所有帮助我的人。在

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

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

不管怎样,谢谢你。在

[原题] 我是一个Java/PHP/Delphi程序员,只在破解别人的程序时使用Python——从来没有亲自编写过复杂的Python。因为这周我的空闲时间很短,所以我决定用Python写一些非琐碎的东西,这是我的问题

首先,我有这样的python文件:

src/
    main.py
    SomeUtils.py

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

^{pr2}$

然后在“主.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:------------------------------------------------------

谢谢你们。在

我认为,发布实际代码可能更好,因此如下所示:

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

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

给你主.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_of line_with prefix”,该函数工作正常。在

如果我使用“from XWinInfos import*;”,则错误为“NameError:global name‘XWinInfo’is not defined”。在

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

请帮忙。 提前谢谢。在


Tags: 函数namefrompyimportreturnmaindef
3条回答

嗯。。。在你的例子中有几个错别字,所以我想知道你的实际代码是否也有一些错别字。下面是一个快速测试的完整源代码,它工作正常,没有导入错误。在

在SomeUtils.py公司名称:

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

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

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

在主.py公司名称:

^{pr2}$

[根据操作附加信息编辑]

我仍然无法重新创建相同的错误,但是您发布的代码在最初对XWinInfox.pyinit方法:

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代码,我只是删除了依赖于该文件的方法。有了stubbed方法并更正了前面提到的错误,您发布的代码现在可以工作了。在

你可能想重写主.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除非您有多个 一行语句
  • 没有必要 在中包装条件测试 除分组外的括号
  • ^{ 污染全局命名空间

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

编辑:您的错误

ImportError: cannot import name MyClass1

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

再说一遍:你的类MyClass1是否存在无关紧要。{你的系统中可能有另一个案例。否则:norepro。在

相关问题 更多 >

    热门问题