python - Scrapy:从不在同一目录中的项目导入包

标签 python import scrapy

我正在尝试从我的项目中导入一个包,该包与 scrapy 所在的目录不在同一个目录中。我的项目的目录结构如下:

Main
  __init__.py
  /XPaths
    __init.py
    XPaths.py
  /scrapper
    scrapy.cfg
    /scrapper
      __init.py
      settings.py
      items.py
      pipelines.py
      /spiders
        myspider.py

我正在尝试从 myspider.py 中访问 xpaths.py。这是我的尝试:

1) 从 Main.XPaths.XPaths 导入 XPathsHandler

2) 从 XPaths.XPaths 导入 XPathsHandler

3) 从 ..Xpaths.XPaths 导入 XPathsHandler

这些失败并出现错误:

ImportError: No module named .......

我最后一次尝试是:

4) 从 ...Xpaths.XPaths 导入 XPathsHandler

同样失败并出现错误:

ValueError: Attempted relative import beyond toplevel package

我做错了什么? XPaths 独立于 Scrapy,因此文件结构必须保持原样。

//编辑

在@alecxe 评论后进一步调试后,我尝试在 sys.path 中添加到 main 的路径,并在导入 xpaths 之前打印它。奇怪的是,当我运行 scrapy 时,scrapper 目录被附加到路径中。这是我添加的内容:

'C:\\Users\\LaptOmer\\Code\\Python\\PythonBackend\\Main'

这是我在打印 sys.path 时得到的结果:

'C:\\Users\\LaptOmer\\Code\\Python\\PythonBackend\\Main\\scrapper'

为什么 scrapy 将其附加到路径中?

最佳答案

我知道这是一个有点困惑的解决方案,但当我遇到与您相同的问题时,我只能找到一个。在包含项目中的文件之前,您需要手动将系统路径附加到最顶层的包级别,即:

sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
from XPaths.XPaths import XPathsHandler
...

据我了解,scrappy 会创建自己的包 - 这就是为什么您不能从其他目录导入文件的原因。这也解释了错误:

ValueError: Attempted relative import beyond toplevel package

关于python - Scrapy:从不在同一目录中的项目导入包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18196458/

相关文章:

python - 另一个导入完成后,导入的函数不再起作用

python - 缺少 1 个必需的位置参数 : 'response' scrapy

python - 从 scrapy 爬虫获取空结果

json - 如何使用aerospike查询语言导入json数据?

python - 如何在 Python3 中获取 "old"zip()?

python - 套餐可以永久使用吗?

python - pydantic constr 和 mypy 检查之间的冲突

java - 为什么JDBC是动态加载而不是导入的?

xpath - Scrapy-如何将字符串转换为可以在其上使用XPath的对象?

python - URL 参数破坏 Flask 模板