Solución:
los <<
parte está mal, usa <
en lugar de:
$ ./manage.py shell < myscript.py
También puedes hacer:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Para python3 necesitarías usar
>>> exec(open('myscript.py').read())
No se recomienda hacer eso desde el shell
– y esto tiene la intención de que no debería ejecutar scripts aleatorios desde el entorno de django (pero no están formas de evitar esto, vea las otras respuestas).
Si se trata de un script que ejecutará varias veces, es una buena idea configurarlo como un comando personalizado, es decir
$ ./manage.py my_command
para hacer esto, cree un archivo en un subdirectorio de management
y commands
de tu app
, es decir
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
y en este archivo defina su comando personalizado (asegurándose de que el nombre del archivo sea el nombre del comando desde el que desea ejecutar ./manage.py
)
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, **options):
# now do the things that you want with your models here
Para cualquiera que use Django 1.7+, parece que simplemente importar el módulo de configuración no es suficiente.
Después de investigar un poco, encontré esta respuesta de Stack Overflow: https://stackoverflow.com/a/23241093
Ahora necesita:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Sin hacer lo anterior, estaba obteniendo un django.core.exceptions.AppRegistryNoReady
error.
Mi archivo de script está en el mismo directorio que mi proyecto django (es decir, en la misma carpeta que manage.py)