2017-06-17 7 views
0

Cette erreur se produit uniquement sur la commande scrapyd-deploy.Scrapyd uniquement - Pas de nom de module django_project.settings

Packing version r240-master 
Deploying to project "foo_bot" in http://localhost:6802/addversion.json 
Server response (200): 

{ 
    "status": "error", 
    "message": "Traceback (most recent call last): 
     File \"/usr/lib/python2.7/runpy.py\", line 174, in _run_module_as_main 
     \"__main__\", fname, loader, pkg_name) 
     File \"/usr/lib/python2.7/runpy.py\", line 72, in _run_code 
     exec code in run_globals 
     File \"/usr/local/lib/python2.7/dist-packages/scrapyd/runner.py\", line 40, in <module> 
     main() 
     File \"/usr/local/lib/python2.7/dist-packages/scrapyd/runner.py\", line 37, in main 
     execute() 
     File \"/usr/local/lib/python2.7/dist-packages/scrapy/cmdline.py\", line 109, in execute 
     settings = get_project_settings() 
     File \"/usr/local/lib/python2.7/dist-packages/scrapy/utils/project.py\", line 68, in get_project_settings 
     settings.setmodule(settings_module_path, priority='project') 
     File \"/usr/local/lib/python2.7/dist-packages/scrapy/settings/__init__.py\", line 292, in setmodule 
     module = import_module(module) 
     File \"/usr/lib/python2.7/importlib/__init__.py\", line 37, in import_module 
     __import__(name) 
     File \"build/bdist.linux-x86_64/egg/foo_bot/settings.py\", line 21, in <module> 
     File \"/usr/local/lib/python2.7/dist-packages/django/__init__.py\", line 22, in setup 
     configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) 
     File \"/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py\", line 56, in __getattr__ 
     self._setup(name) 
     File \"/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py\", line 41, in _setup 
     self._wrapped = Settings(settings_module) 
     File \"/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py\", line 110, in __init__ 
     mod = importlib.import_module(self.SETTINGS_MODULE) 
     File \"/usr/lib/python2.7/importlib/__init__.py\", line 37, in import_module 
     __import__(name) 
     ImportError: No module named foo_project.settings 
    ", 
    "node_name": "ubuntu" 
} 

La structure du projet est la suivante:

/home/dev/workspace/fufu 
|--dev_venv/bin/activate 
| 
|--foo_bot 
| |--scrapy.cfg 
| | 
| |--foo_bot 
|  |--settings.py 
|  |--settings_dev.py 
|  |--settings_deploy.py 
|  |--items.py and blablabla 
|  |--spiders 
|  |--blablablaspider.py 
| 
|--foo_project 
    |--manage.py 
    | 
    |--app 
    | |--models.py and blablabla 
    | 
    |--foo_project 
     |--settings.py 
     |--settings_dev.py 
     |--settings_deploy.py 
     |--wsgi.py and blablabla 

scrapy.cfg

[settings] 
default = foo_bot.settings 

[deploy:local] 
url = http://localhost:6801/ 
project = foo_bot 

[deploy:development] 
url = http://localhost:6802/ 
project = foo_bot 
version = GIT 

[deploy:deployment] 
url = http://localhost:6800/ 
project = foo_bot 
version = GIT 

foo_bot/foo_bot/settings.py

import os 
import sys 
import django 

########## PATH CONFIGURATION 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
FALSE_BASE_DIR = os.path.dirname(BASE_DIR) 
#WORKSPACE_DIR = os.path.dirname(FALSE_BASE_DIR) // fail with just scrapy crawl bar 
WORKSPACE_DIR = '/'.join([os.path.expanduser('~'), 'workspace']) 
BOT_NAME = 'foo_bot' 
########## END PATH CONFIGURATION 

########## DJANGO CONFIGURATION 
DJANGO_PROJECT_PATH = '/'.join([FALSE_BASE_DIR, 'foo_project']) 
DJANGO_SETTINGS_MODULE = 'foo_project.settings' 
sys.path.append(DJANGO_PROJECT_PATH) 
sys.path.insert(0, DJANGO_PROJECT_PATH) 
os.environ['DJANGO_SETTINGS_MODULE'] = DJANGO_SETTINGS_MODULE 
django.setup() 
########## END DJANGO CONFIGURATION 

#blablabla settings 

try: 
    from settings_dev import * 
except ImportError: 
    pass 

foo_project/foo_project/settings.py

import os 

########## PATH CONFIGURATION 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
FALSE_BASE_DIR = os.path.dirname(BASE_DIR) 
WORKSPACE_DIR = os.path.dirname(FALSE_BASE_DIR) 
PROJECT_NAME = 'foo_project' 
########## END PATH CONFIGURATION 

foo_project/foo_project/wsgi.py

Et j'utilise virtualenv pour définir les variables d'environnement PYTHONPATH et DJANGO_SETTINGS_MODULE à la fin de activate script comme suit:

export PYTHONPATH="/home/dev/workspace/fufu/foo_project" 
export DJANGO_SETTINGS_MODULE="foo_project.settings" 

Je cours scrapy crawl bar à fufu/foo_bot, il s'exécute avec succès (et enregistrer dans la base de données via djangoitem).

Je cours django-admin.py à fufu/foo_project, il fonctionne avec succès sans avertissements. Je cours python manage.py à fufu/foo_project, il fonctionne avec succès sans warings. Je cours scrapyd-deploy development -p foo_bot avec l'utilisateur dev et virutalenv dev_venv.

Il renvoie des erreurs comme ci-dessus.

Le scrapyd est appelé à /home/dev/workspace/ avec l'utilisateur et le port dev6802

Cependant, j'ai un autre utilisateur deploy une copie de projet à /home/deploy/workspace/fufu/ avec seulement différent sur le from settings_dev-from settings_deploy et les chemins absolus.

Je cours scrapyd-deploy deployment -p foo_bot avec l'utilisateur deploy et virutalenv deploy_venv.

Il fonctionne parfaitement.

Le scrapyd est appelé au /home/deploy/workspace/ avec l'utilisateur deploy et le port 6800.

Comment puis-je résoudre ce problème? J'ai vu tous les threads et je n'ai aucune idée pourquoi l'utilisateur dev échoue mais deploy fonctionne.

+0

Ne doit pas être '' foo_project.settings' foo_project.foo_bot.settings'? –

+0

C'est ma faute quand j'ai tapé la structure –

Répondre

0

OK Je l'ai eu. C'est à cause de os.path.dirname() me obtiendra chemin vide.

foo_bot/foo_bot/settings.py

########## PATH CONFIGURATION 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
#FALSE_BASE_DIR = os.path.dirname(BASE_DIR) 
#WORKSPACE_DIR = os.path.dirname(FALSE_BASE_DIR) // fail with just scrapy crawl bar 
WORKSPACE_DIR = '/'.join([os.path.expanduser('~'), 'workspace']) 
FALSE_BASE_DIR = '/'.join([WORKSPACE_DIR, 'fufu']) 
BOT_NAME = 'foo_bot' 
########## END PATH CONFIGURATION