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

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

我正试图从xpaths.py内部访问myspider.py。以下是我的尝试:
1)from Main.XPaths.XPaths import XPathsHandler
2)from XPaths.XPaths import XPathsHandler
3)from ..Xpaths.XPaths import XPathsHandler
这些操作失败,错误为:
ImportError: No module named .......

我最后一次尝试是:
4)from ...Xpaths.XPaths import XPathsHandler
也失败了,错误是:
ValueError: Attempted relative import beyond toplevel package

我做错什么了?XPaths独立于Scrapy,因此文件结构必须保持这种状态。
//编辑
在@alecxe comment之后进行了进一步的调试之后,我尝试在main中添加sys.path的路径,并在导入xpath之前将其打印出来。奇怪的是,当我运行scrapy时,scrapper目录会附加到路径中。我补充说:
'C:\\Users\\LaptOmer\\Code\\Python\\PythonBackend\\Main'

以下是我打印时得到的信息:
'C:\\Users\\LaptOmer\\Code\\Python\\PythonBackend\\Main\\scrapper'

为什么scrapy会把它附加到路径上?

最佳答案

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

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

据我所知,braggy创建了自己的包——这就是为什么不能从其他目录导入文件。这也解释了错误:
ValueError: Attempted relative import beyond toplevel package

09-25 16:48