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