Python导入问题
[结束说明] 感谢大家的帮助。
我找到了问题,和我对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 个回答
我猜你是指
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()
你为什么要从 XWinInfos
导入呢?你应该从 SomeUtils
导入。更重要的是,使用 *
这种方式导入是不推荐的。
编辑:你的错误
ImportError: cannot import name MyClass1
这个错误基本上告诉你,在 SomeUtils
里没有定义 MyClass1
。可能是因为你系统路径上有另一个 SomeUtils.py
文件被导入了。如果那个文件里没有 MyClass1
,你就会看到这个错误。
再说一遍:你 MyClass1
类是否存在并不重要。可能的情况是你系统上有另一个 XWinInfos.p(y|o|w)
文件被导入了。否则的话:无法重现。
嗯……你这个例子里有几个拼写错误,我在想你的实际代码里是不是也有类似的错误。这里有一段完整的代码,经过快速测试,运行得很好,没有导入错误。
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 的代码,所以我只是简单地写了依赖于那个文件的方法的占位符。经过这些占位符的方法和修正之前提到的拼写错误后,你现在发的代码可以正常工作了。