我试图从我的项目导入一个包,但它与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要把它附加到路径上?
3条答案
按热度按时间jk9hmnmh1#
我知道这是一个有点混乱的解决方案,但只有一个我可以找到当我有同样的问题,因为你。之前包括文件从你的项目,你需要手动追加系统路径到你的最顶层包的水平,即:
据我所知,scrappy创建了自己的包-这就是为什么你不能从其他目录导入文件。这也解释了错误:
tzxcd3kk2#
我遇到了同样的问题。
当我使用:
它将
../..
附加到最后一个文件路径,但这并不起作用。我注意到我的主文件是sys.path列表中的最后一项。我取了最后一项并转到模块级找到我的主文件--它包含一个名为“extract_notes”的函数。希望能有所帮助。
t3psigkw3#
我有一个类似的目录结构,有多个scraper(比如目录
scraper1
和scraper2
)。因为我发现@ErdraugPl建议的
sys.path
修改太脆弱了(参见@ethanenglish的问题),特别是Scrapy本身正在修改sys.path
,所以我选择了OS解决方案而不是Python解决方案:我在scraper1
和scraper2
中创建了一个指向目录/XPaths
的符号链接。