3

我正在尝试从我的项目中导入一个包,该包与 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 评论之后进一步调试后,我尝试将路径添加到main内部sys.path,并在导入 xpaths 之前打印它。奇怪的是,scrapper当我运行 scrapy 时,目录会附加到路径中。这是我添加的内容:

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

这是我打印时得到的sys.path

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

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

4

2 回答 2

1

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

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

据我了解,scrapy 创建了自己的包 - 这就是您无法从其他目录导入文件的原因。这也解释了错误:

ValueError: Attempted relative import beyond toplevel package
于 2013-12-17T17:46:59.043 回答
0

我遇到了同样的问题。

当我使用:

sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))

它附加../..到最后一个文件路径,这不起作用。我注意到我的主文件是 sys.path 列表中的最后一项。我拿了最后一项并进入模块级别找到我的主文件——其中包含一个名为“extract_notes”的函数。

import scrapy
import sys
import os

mod_path = os.path.dirname(os.path.normpath(sys.path[-1]))
sys.path.insert(0,mod_path)

from pprint import pprint as p
from main import extract_notes

希望有帮助。

于 2019-04-22T21:09:21.493 回答