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

tkqqtvp1  于 2022-12-04  发布在  其他
关注(0)|答案(3)|浏览(206)

我试图从我的项目导入一个包,但它与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)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注解之后进行了一些进一步的调试之后,我尝试在sys.path中添加main的路径,并在导入xpaths之前打印它。奇怪的是,当我运行scrapy时,scrapper目录被附加到路径中。下面是我添加的内容:

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

当我打印sys.path时,会得到以下结果:

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

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

jk9hmnmh

jk9hmnmh1#

我知道这是一个有点混乱的解决方案,但只有一个我可以找到当我有同样的问题,因为你。之前包括文件从你的项目,你需要手动追加系统路径到你的最顶层包的水平,即:

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

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

ValueError: Attempted relative import beyond toplevel package
tzxcd3kk

tzxcd3kk2#

我遇到了同样的问题。
当我使用:

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

希望能有所帮助。

t3psigkw

t3psigkw3#

我有一个类似的目录结构,有多个scraper(比如目录scraper1scraper2)。
因为我发现@ErdraugPl建议的sys.path修改太脆弱了(参见@ethanenglish的问题),特别是Scrapy本身正在修改sys.path,所以我选择了OS解决方案而不是Python解决方案:我在scraper1scraper2中创建了一个指向目录/XPaths的符号链接。

相关问题