我正在尝试从我的项目中导入一个包,该包与 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/