2016-11-04 55 views
0

我有兩個蜘蛛AB。 我需要調用它在蜘蛛settings.py文件中定義的函數從蜘蛛Scrapy調用一個函數設置

Project Name |--Project Name | |-- spiders | | |-- __init__.py | | |-- A.py | | |-- B.py | |-- __init__.py | |-- items.py | |-- pipelines.py | |-- settings.py

有settings.py中的函數,這是我需要從A.py和B.py來訪問近蜘蛛

settings.py

def revoke_ip(): 
    logging.info('Revoking access') 

。這是我從A.py嘗試:

def closed(self, reason): 
    logging.info('Spider terminating because of %s' % reason) 
    current_project_settings = get_project_settings() 
    revoke_ip_call = getattr(current_project_settings, "revoke_ip") 
    revoke_ip_call() 

但是這件事情不工作,也不是什麼提到here

有什麼,我做錯了或任何其他方式做到這一點?

回答

1

導入文件時,Python只會搜索當前目錄,運行入口點腳本的目錄以及包含位置(如程序包安裝目錄)的sys.path。您可以導入設置文件以調用該功能。要做到這一點,添加到您的函數:

import sys 
sys.path.insert(0, '../') 
import settings 
+0

而我該如何調用撤銷函數settings.revoke()? 如果我從'scrapy crawl A'的外部'project name'文件夾中運行爬蟲,我得到一個錯誤'ImportError:No module named settings' – Vaulstein

+0

這個東西部分地解決了我的問題,所以我打開了答案。謝謝! – Vaulstein

+1

如果您從其他文件夾運行項目,則必須指定包含要使用的模塊的文件夾。您可以嘗試使用設置模塊的絕對路徑。不客氣,我希望它有幫助。 –

0

什麼工作對我來說,這要歸功於@Jose張貼的答案,是因爲settings.py在不同的目錄蜘蛛,我在奔跑着,只Python的搜索當前目錄。

所以,我想檢查的文件,它給的每次我運行的蜘蛛,顯然,我得到了

/tmp/unpacked-eggs/__main__.egg/project name/spiders 

所以,我必須做的是路徑的路徑:

import sys 
import os 
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + '/../') 
import settings