[结束语] 谢谢大家试图帮助我。
我发现了问题,它与我对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”。
请帮助。 提前谢谢。
答案 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()
一些快速说明:
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)