python module importing error
我有以下结构:
1 2 3 4 5 6 7 8
| AXBot:
__init__.py
bot.py
util.py
settings.py
creator
__init__.py
xbot.py |
问题是我无法在"xbot.py"中导入"util"模块,因为python以"importerror:no module named util"结尾…我如何解决?
PS:我正在使用以下代码导入:
1 2
| import util
import settings |
谢谢您。
- 您从哪个目录运行代码,以及如何启动代码?
- 没有要导入的实用程序模块。python只在modules目录和sys.path中的所有目录中查找要导入的模块,而axbot.creator包中没有module util。使用import AXBot.settings as settings或from AXBot import settings。
- 但这些答案都不是解决办法。
使用相对导入
1 2
| from . import util
from . import settings |
不过,我还是建议更改您的文件夹层次结构,这对我来说更清晰。还要检查一下你的Python,它应该像你做的那样正常工作。
参考文献:
- PET-0328
- 如何导入上面目录的python类
- 从父目录导入
尽量远离sys.path黑客。
- 尝试了相对导入。python抛出"valueerror:尝试在非包中进行相对导入"
- 我猜你是从axbot/creator目录运行这个目录的,也就是说,python xbot.py。相反,将它用作一个要使用的包:在axbot目录之外的脚本上运行它,并执行from AXBot.creator import xbot。还有,@tehmisvh:你不是说from .. import utils吗?
- @戴维德罗宾森:使用..也不起作用。它给出的错误与香港项目的评论相同。
- 阅读我评论的第一部分:你必须在目录之外使用一个脚本,并且使用类似于from AXBot.creator import xbot的xbot。运行python xbot.py将始终导致该问题。
似乎您正试图从creator文件夹中运行xbot.py。
这是我用包含import util的xbot.py得到的输出:
1 2 3 4 5
| 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 |
这是我用包含from . import util的xbot.py得到的输出。
1 2 3 4 5
| 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不在包装内。
我用from AXBot import util替换了试图导入util的行,移动了几个目录,使用python的-m命令行开关运行xbot.py,命令行开关告诉python运行一个由模块名而不是文件名指定的模块。请注意,当您使用-m时,您传入模块的完全限定名,包括包层次结构,但不包括文件扩展名.py,因为这不是模块名的一部分:
1 2 3 4
| 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。
- 谢谢!它起作用了!我使用-m选项运行脚本并传递init模块名。它奏效了。
- 只是一个小问题:如果我只使用文件名引用文件,则脚本找不到该文件,因为工作目录与脚本的位置不同。如何引用脚本目录中的文件?
- @hkproj:在python脚本中,__file__包含运行脚本的文件名。在上面使用os.path.dirname以使脚本用完目录,并使用os.path.join将文件名附加到此目录。请参见docs.python.org/library/os.path.html。
- 谢谢您!我是Python的新手…
我认为名称间距不正确。从xbot.py,尝试使用此导入命令
1 2
| from AXBot import util
from AXBot import settings |
- 尝试。没有解决。
- 是否收到导入错误?或者只是在调用函数时不工作。我需要看看您是如何调用util和settings中的对象的。您可以尝试导入axbot.util和导入axbot.settings。
- 我都试过了。我收到导入错误。
你在哪里是最重要的问题!根据这一点,您可以使用import。请更新您的问题