2012-07-14 244 views
0

我有以下结构:Python模块导入错误

AXBot: 
    __init__.py 
    bot.py 
    util.py 
    settings.py 
    creator 
     __init__.py 
     xbot.py 

的问题是,我不能导入“UTIL”模块中的“xbot.py”,因为蟒蛇结尾为“导入错误:没有模块名为UTIL” ...我如何解决?

PS:我用下面的代码导入:

import util 
import settings 

谢谢。

+0

从哪个目录是你运行代码以及如何启动它? – 2012-07-14 20:22:28

+0

没有* util *模块可导入。 Python只会在modules目录和'sys.path'中的所有目录中查找要导入的模块,并且* AXBot.creator *包中根本没有模块* util *。使用'导入AXBot.settings作为设置'或'从AXBot导入设置' – 2012-07-14 20:36:07

+1

但没有答案是解决方案。 – 2012-07-14 20:49:58

回答

1

看来你试图从creator文件夹中运行xbot.py

这是输出我用含import utilxbot.py得到:

C:\Users\Luke\Python stuff\AXBot\creator>xbot.py 
Traceback (most recent call last): 
    File "C:\Users\Luke\Python stuff\AXBot\creator\xbot.py", line 4, in <module> 
    import util 
ImportError: No module named util 

这是输出我用含xbot.pyfrom . import util

C:\Users\Luke\Python stuff\AXBot\creator>xbot.py 
Traceback (most recent call last): 
    File "C:\Users\Luke\Python stuff\AXBot\creator\xbot.py", line 3, in <module> 
    from . import util 
ValueError: Attempted relative import in non-package 

我也得到后者的错误与from .. import util代替from . import util得到。

如果您从包含它的目录运行xbot.py,Python无法确定它是否在包层次结构中运行。它认为xbot.py不在包内。

我取代了尝试导入utilfrom AXBot import util线,感动了一对夫妇的目录,并使用Python的-m命令行开关,它告诉Python来运行的模块名称而不是文件名指定的模块运行xbot.py。请注意,当您使用-m,你的模块,包括包层次的完全限定名称传递,但不包括文件扩展名.py,因为这不是模块的名称的一部分:

C:\Users\Luke\Python stuff\AXBot\creator>cd ..\.. 

C:\Users\Luke\Python stuff>python -m AXBot.creator.xbot 
1232 

如果我使用import AXBot.util as util而不是from AXBot import util,我得到了相同的输出。

(我没有你的代码运行,所以不是我把一个变量util.py,并试图从xbot.py内打印其值。这个变量的值是1232)。

+0

非常感谢!有用!我使用-m选项运行脚本并传递__init__模块名称。有效。 – 2012-07-14 22:45:15

+0

只是一个小问题:如果我仅使用文件名称引用文件,则脚本无法找到该文件,因为工作目录与脚本的位置不同。我如何参考脚本目录中的文件? – 2012-07-14 22:52:33

+0

@hkproj:在Python脚本中,'__file__'包含正在运行的脚本的文件名。使用'os.path.dirname'来获取脚本用完的目录,并使用'os.path.join'将文件的名称追加到这个目录中。请参阅http://docs.python.org/library/os.path.html。 – 2012-07-15 07:55:22

1

我认为命名空间不正确。从xbot.py,尝试使用此导入命令

from AXBot import util 
from AXBot import settings 
+0

试过。没有解决。 – 2012-07-14 20:43:03

+0

您是否收到导入错误?或者当你调用函数时它不工作。我需要看看你是如何调用util和settings中的对象的。您可以尝试导入AXBot.util并导入AXBot.settings – Wulfram 2012-07-14 21:55:47

+0

我试过两种。我收到导入错误。 – 2012-07-14 22:39:52

0

你在哪里是最重要的问题!根据这个,你使用import。请更新您的问题

2

使用relative importing

from . import util 
from . import settings 

我虽然电子书籍改变你的文件夹结构,看起来清洁剂给我。同时检查你的PYTHONPATH,它通常应该如你所做的那样工作。

参考文献:

尝试从sys.path的黑客留下

+0

尝试相对导入。 Python会抛出'ValueError:试图在非包中导入相对' – 2012-07-14 20:43:38

+0

我猜你正在从AXBot/creator目录 - 也就是'python xbot.py'运行它。相反,将它作为一个包来使用:在AXBot目录之外的脚本上运行它,并从'AXBot.creator import xbot'执行。另外,@tehmisvh:你是不是指'from ... import utils'? – 2012-07-14 21:25:00

+0

@DavidRobinson:使用'..'也不起作用。它给出了和hkproj的评论一样的错误。 – 2012-07-14 21:27:03