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

时间:2013-08-12 20:50:15

标签: python import scrapy

我正在尝试从我的项目导入一个包,该包与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,因此文件结构必须保持这种状态。

// EDIT

在@alecxe评论之后进行了一些进一步调试之后,我尝试在main内添加sys.path的路径,并在导入xpath之前打印它。奇怪的是,当我运行scrapy时,scrapper目录被附加到路径。这是我添加的内容:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

ValueError: Attempted relative import beyond toplevel package

答案 1 :(得分:0)

我遇到了同样的问题。

当我使用时:

add_action( 'init', 'user_status_taxonomy' );
function user_status_taxonomy() {
 register_taxonomy(
    'profession', 'user',
     array(
        'public' => true,
        'labels' => array(
            'name' => __( 'Professions' ),
            'singular_name' => __( 'Profession' ),
            'menu_name' => __( 'Professions' ),
            'search_items' => __( 'Search Professions' ),
            'popular_items' => __( 'Popular Professions' ),
            'all_items' => __( 'All Professions' ),
            'edit_item' => __( 'Edit Profession' ),
            'update_item' => __( 'Update Profession' ),
            'add_new_item' => __( 'Add New Profession' ),
            'new_item_name' => __( 'New Profession Name' ),
            'separate_items_with_commas' => __( 'Separate professions with commas' ),
            'add_or_remove_items' => __( 'Add or remove professions' ),
            'choose_from_most_used' => __( 'Choose from the most popular professions' ),
        )
    )
);
}

sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) 附加到最后一个文件路径,该路径无效。我注意到我的主文件是sys.path列表中的最后一项。我拿了最后一个项目,然后转到模块级别以找到我的主文件-该文件包含一个名为“ extract_notes”的函数。

../..

希望有帮助。