Python中的导入问题
[闭幕词] 谢谢你们每个试图帮助我的人 我发现了这个问题,这与我对python的理解无关(这一点很小)p 问题是我编辑了同一项目的错误分支,一个分支中的Main.py和另一个分支中的XWinInfos.py 无论如何,谢谢你 [原问题] 我是一名Java/PHP/Delphi程序员,只有在破解别人的程序时才使用Python——我自己从来没有编写过复杂的Python。由于本周我有很短的空闲时间,我决定用Python编写一些非琐碎的东西,这就是我的问题 首先,我有如下python文件:Python中的导入问题,python,import,Python,Import,[闭幕词] 谢谢你们每个试图帮助我的人 我发现了这个问题,这与我对python的理解无关(这一点很小)p 问题是我编辑了同一项目的错误分支,一个分支中的Main.py和另一个分支中的XWinInfos.py 无论如何,谢谢你 [原问题] 我是一名Java/PHP/Delphi程序员,只有在破解别人的程序时才使用Python——我自己从来没有编写过复杂的Python。由于本周我有很短的空闲时间,我决定用Python编写一些非琐碎的东西,这就是我的问题 首先,我有如下python文件: src/
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:----------------------------------------------------------
谢谢你们
我认为,发布实际代码可能会更好,因此如下所示:
注:我知道“;”和“(…”),但我喜欢这样
这是dir结构。
如您所见,我只是添加了一个空的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_of line_with prefix”,该函数工作正常
如果使用“from XWinInfos import*;”,则错误为“NameError:未定义全局名称‘XWinInfo’”
如果使用“from XWinInfos import XWinInfo;”,则错误为“ImportError:无法导入名称XWinInfo”
请帮忙。
提前感谢。您为什么要从
XWinInfos
导入?您应该从某些工具导入。更不用说*
风格的导入是不受欢迎的
编辑:您的错误
ImportError:无法导入名称MyClass1
基本上告诉您在SomeUtils
中没有定义MyClass1
。这可能是因为您在系统路径上的某个位置有另一个SomeUtils.py
文件,而该文件正被导入。如果该文件没有MyClass1
,则会出现此错误
再次说明:你的classMyClass1
是否存在无关紧要。可能的情况是,你的系统上有另一个XWinInfos.p(y | o | w)
并且它正在被导入。否则:norepro你可能需要重写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 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()
嗯……在你的例子中有几个输入错误,所以我想知道你的实际代码是否也有一些输入错误。这是一个快速测试的完整源代码,它运行良好,没有导入错误
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.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”字前后应该有两个下划线。现在您有“\uuuu init\uuuuy”
,它应该是”\uuuu init\uuuuuuy'
,但这不会阻止代码正常工作
因为我没有RegExUtils.py代码,所以我只是剔除了依赖于该文件的方法。有了这些剔除的方法并纠正了前面提到的错误,您发布的代码现在就可以正常工作了。您的问题自然会与许多旧问题联系在一起。
请看,仅供参考,并且那一行应该是“from SomeUtils import*”?您能在这里发布实际代码吗?什么是“from XWinInfos import*”?不应该是“SomeUtils”?您的Python路径是什么样的?在“src/”中是否有一个“init.py”?并且:Python不需要那些花哨的“;“在每一行的末尾。您应该删除它们……是的。”SomeUtils“不,没有init.py。我应该创建它吗?它里面应该是什么?它也可以是空的,但它必须存在。我已经发布了实际的代码,请查看(“编辑2”)。感谢您的发布。XWinInfos是一个键入错误,因此应该是SomeUtils。问题仍然存在,并显示相同的错误消息。编辑后:再次感谢。我确信MyClass1存在(复制粘贴)。如果它导入另一个模块,funct1如何工作。您对我的mis类型的看法是正确的,但我确实对该类有问题。很抱歉键入错误,我更改了名称以分散实际问题的注意力(但这里似乎是个错误)。无论如何,当我将导入部分更改为:“from SomeUtils import funct1”和我有一个错误“ImportError:无法导入名称MyClass1”。与这个问题完全无关