Estoy tratando de iniciar un servidor de prueba mini-Django usando algunos datos fijos, para probar.

Cuando se ejecuta de forma interactiva (desde el REPL), se ejecuta correctamente, cuando se ejecuta como parte de un script por python myscript.py, falla. Supongo que hay algo diferente en el entorno, pero ¿qué?

Código:

import os
import sys
import json
import resttest
import unittest
from multiprocessing import Process
from django.core.management import execute_from_command_line

server_process = None
prefix = 'http://localhost:8000'

path = os.getcwd()
os.chdir('testapp') # Django project is separate and in subfolder 'testapp'
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testapp.settings")
config_args = list()
config_args.append('')
config_args.append('testserver')
config_args.append('test_data.json')
proc = Process(target=execute_from_command_line, args=[config_args])
proc.start()
os.chdir(path)

Error:

Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 392, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 261, in fetch_command
    commands = get_commands()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 107, in get_commands
    apps = settings.INSTALLED_APPS
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 54, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 49, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 132, in __init__
    % (self.SETTINGS_MODULE, e)
ImportError: Could not import settings 'testapp.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named testapp.settings

Contexto:

Estoy trabajando en un pequeño proyecto de Python para probar y comparar servicios REST. Utiliza enlaces pycurl para proporcionar un control de bajo nivel de las solicitudes HTTP emitidas, para facilitar las pruebas. Para asegurarme de que está usando pycurl correctamente, he creado una API REST de Django básica para usar en pruebas funcionales.

1
BobMcGee 2 sep. 2014 a las 00:06

2 respuestas

La mejor respuesta

Agregue el directorio padre de testapp/ a la ruta de Python.

sys.path.append("/path/to/directory/")

Puede determinar esta ubicación mediante programación, por supuesto; los comandos utilizados para hacerlo dependen de dónde esté su script en comparación con la ubicación de testapp. Puede soltar las os.getcwd() y os.chdir(). Lo que importa es PYTHONPATH, no el directorio de trabajo. Está especificando la variable de entorno del módulo de configuración correctamente, pero los documentos tome nota de configurar correctamente la ruta de búsqueda de importación de Python.

Aparte 1: eche un vistazo a django.core.management.call_command. Es un acceso directo, aunque aún necesita configurar el módulo de configuración. call_command('testserver', 'test_data.json')

Aparte 2: Puede omitir la configuración de una variable de entorno como se menciona en documentos aquí. En tu caso:

from django.conf import settings
from testapp import settings as my_settings

settings.configure(my_settings)
5
JCotton 5 sep. 2014 a las 20:45

¿Qué hay de agregar export PYTHONPATH=$PYTHONPATH:$PWD a tu .env?

0
Kasravnd 5 sep. 2014 a las 21:04