python包内导入模块失败?

我的文件是这样的

w3school:
spiders

__ __init___.py
w3school_spider.py

__init__.py
items.py

我现在在w3school_spider.py中导入items中的一个类,我写的是这样:

from w3school.items import W3schoolItem

但是显示

ImportError: No module named w3school.items

如果我改成:
from .items import W3schoolItem
则会显示:
ValueError: Attempted relative import in non-package

我搜了一下是不是路径问题?需要我把这个items.py放进c/python2.7/lib中吗?

请各位看看,谢谢。

阅读 7.3k
4 个回答

命令行参数-m可以将模块进行模块化启动,此时名称为模块名(不是__main__),程序中就可以添加相对导入
-m操作必须在模块上一层目录执行(不在当前目录),格式:python -m new.w3school_spider
记住末尾没有.py。

也可以直接把items.py放到spiders里面,此时items.py和w3school_spider.py在同一个
文件夹里,默认进行相对导入,直接from items import W3schoolItem

第一个错误原因就是Python没有在同文件中找到你要的模块,第二个错误是因为运行的模块
中(名称为__main__)不能有相对导入。

试试在前面加上

import sys
#加入w3school的路径
sys.path.append('/path/to')   

而且相对路径是相对当前模块名的,而主模块名一定是“__main__”,所以
是在主模块中无法找到相对路径的包的,必须使用绝对路径。非主模块
才可以使用相对路径

  • w3school

    • spiders

      • __init__.py

      • w3school_spider.py

    • __init__.py

    • items.py

你的目录结构是这样吗,然后在w3school_spider.py中引用items.py中的内容?

from ..items import W3schoolItem

这样应该能行了吧。
在一个package中,同级使用.,父级使用..

最后有一个建议,可以把一个package中的一些常用的类或者函数放到__init__.py中。

假设有以下项目结构:

project/
    main.py
    module/
        module1.py

main.py中,需要导入module1.py中的函数或类。如果直接使用import module1,会发现无法成功导入。这是因为Python解释器默认只会搜索当前目录和sys.path中的路径。为了解决这个问题,可以在代码中添加sys.path.append()

sys.path简介

sys.path是一个Python列表,用于存储Python解释器搜索模块的路径。当尝试导入一个模块时,Python解释器会依次检查sys.path中的每个路径,看是否存在对应的模块。如果找到了,就会将该模块导入;如果没有找到,就会抛出ModuleNotFoundError异常。

解决方案

要解决无法导入同级目录下的模块的问题,可以在main.py中添加以下代码:

import sys
import os

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

这段代码首先导入了sysos模块。然后,使用os.path.dirname()os.path.abspath()函数获取当前文件的绝对路径,并将其添加到sys.path中。这样,Python解释器就可以正确识别到同级目录下的模块了。

接下来,就可以正常地导入module1.py中的函数或类了:

from module import module1
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题