Como executar um script Python a partir do shell do Django?

247

Eu preciso executar um script Python a partir do shell do Django. Eu tentei:

./manage.py shell << my_script.py

Mas não deu certo. Só estava esperando eu escrever algo.

Ciro Santilli adicionou uma nova foto
fonte
Não é assim que djangofunciona, o que você realmente quer fazer?
Danodonovan 31/05
2
my_script.pycontém algumas operações em um dos meus modelos de Django. Eu já fiz isso antes, mas não me lembro exatamente como.

Respostas:

388

A <<peça está errada, use <:

$ ./manage.py shell < myscript.py

Você também pode fazer:

$ ./manage.py shell
...
>>> execfile('myscript.py')

Para python3, você precisaria usar

>>> exec(open('myscript.py').read())
codeape
fonte
17
Para mim, isso apenas executa a primeira linha do script. A única coisa que funciona é a combinação de ambos os métodos:./manage.py shell <<EOF\ execfile('myscript.py') \EOF
Steve Bennett
Ele não funciona mais com o Python 3+. Alguma idéia para substituir isso?
David D.
4
@DavidD. A substituição é dada nesta resposta aqui
peter2108:
11
Outra solução que parece funcionar para o Python 2.xe 3.x é echo 'import myscript' | python manage.py shell. Descobri que isso pode ser útil para scripts rápidos e sujos que você só precisa executar uma vez, sem ter que passar pelo processo complicado de criar um manage.pycomando.
Atul Varma
1
se você estiver fazendo isso no shell de energia do Windows: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha
219

Você não está recomendado para fazer isso a partir do shell- e este é concebido como você não deve realmente ser a execução de scripts aleatórias do ambiente Django (mas não são maneiras de contornar isso, consulte as outras respostas).

Se este for um script que você executará várias vezes, é uma boa ideia configurá-lo como um comando personalizado, ou seja,

 $ ./manage.py my_command

Para fazer isso, crie um arquivo em um subdir managemente commandsde seu app, ou seja,

my_app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_command.py
    tests.py
    views.py

e, nesse arquivo, defina seu comando customizado (assegurando que o nome do arquivo seja o nome do comando que você deseja executar ./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
danodonovan
fonte
9
Novamente, esta é a melhor resposta. Como o django 1.8 NoArgsCommandestá obsoleto. Esta página fornece um exemplo de trabalho: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
Ger
2
Conforme comentário anterior, para que funcionasse para mim, precisava mudar def handle_noargs(self, **options):para def handle(self, **options):.
James
Link interessante aqui para apoiar esta resposta e a documentação.
precisa
1
Para fazê-lo funcionar, mude para def handle(self, **options):o comentário de James.
Omar Gonzales
Resposta elegante. Muito obrigado
Tessaracter 6/11/19
103

Para quem usa o Django 1.7+, parece que simplesmente importar o módulo de configurações não é suficiente.

Após algumas pesquisas, encontrei esta resposta do Stack Overflow: https://stackoverflow.com/a/23241093

Agora você precisa:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...

Sem fazer o acima, eu estava recebendo um django.core.exceptions.AppRegistryNoReadyerro.

Meu arquivo de script está no mesmo diretório que meu projeto django (ou seja, na mesma pasta que manage.py)

cgons
fonte
2
Minha configuração tem o arquivo de configurações já referenciado na DJANGO_SETTINGS_MODULEvariável de ambiente. Com isso, bastava: import django ; django.setup()abaixo de 1,7.
Taylor Edmiston
1
Com Django 1.7+ esta deve ser a resposta aceita :)
acidjunk
Esta é definitivamente a resposta correta para o Django 1.9.x. A não execução django.setup()não permitirá que o script acesse os modelos do Django, nem os importe!
glarrain
Em um virtualenv você pode simplesmente import django; django.setup().
precisa saber é o seguinte
1
Você fez meu dia! Obrigado por este post. Eu estava ficando confuso no aipo porque não era capaz de executar tarefas no management.call_command: D: D: D
68

Estou atrasado para a festa, mas espero que minha resposta ajude alguém: Você pode fazer isso no seu script Python:

import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings

o resto das suas coisas vai aqui ....

e-nouri
fonte
3
Observe também que você pode soltar as sys.path.appendcoisas desde que esteja DJANGO_SETTINGS_MODULEScerto (por exemplo, se você tiver um script logo acima da raiz do site, poderá fazê-lo os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings').
mgalgs
Acabei fazendo sys.path.append(os.getcwd()), ele funciona quando estou dentro do meu diretório do projeto, meu DJANGO_SETTINGS_MODULE está correto e eu tento executar um script que importar modelos, visualizações, etc.
Danilo Cabello
Sim, mas você não pode executá-lo de qualquer lugar!
E-nouri
Isso não funciona para mim com o django 1.6 - eu tenho um aplicativo. Eu configurei meu caminho para incluir o diretório do projeto django e definir as configurações do projeto. Mas quando tento importar meu aplicativo com "from shoppinglist.models import ShoppingList", recebo um erro que ele não consegue encontrar modelos. Essa mesma linha de importação funciona de dentro do shell manage.py. Alguma ideia?
frankster
33

runscriptde django-extensões

python manage.py runscript scripty.py

Uma amostra script.pypara testá-lo:

from django.contrib.auth.models import User
print(User.objects.values())

Mencionado em: http://django-extensions.readthedocs.io/en/latest/command_extensions.html e documentado em:

python manage.py runscript --help

Há um tutorial também .

Testado no Django 1.9.6, django-extensions 1.6.7.

Ciro Santilli adicionou uma nova foto
fonte
1
Esta é a melhor resposta se você já estiver usando django-extensions(você deveria). Nota: Parece que runscriptusa o django padrão shell. Seria fantástico se fosse usado shell_plus(também em extensões) para que você não precisasse importar tudo para scripts simples.
grokpot
12

Se o IPython estiver disponível (pip install ipython ), ele ./manage.py shellusará automaticamente seu shell e você poderá usar o comando magic %run:

%run my_script.py
gitaarik
fonte
Trabalhou como um encanto!
Roel
Isso tem a vantagem de runscriptfuncionar com scripts fora do projeto / pacote e não se queixar assimTypeError: the 'package' argument is required to perform a relative import for
smido 15/04
8

Você pode simplesmente executar o script com a DJANGO_SETTINGS_MODULEvariável de ambiente definida. Isso é tudo o que é necessário para configurar o ambiente do Django-shell.

Isso funciona no Django> = 1.4

Vlastimil Zíma
fonte
7

O @AtulVarma forneceu um comentário muito útil sob a resposta aceita que não funciona :

echo 'import myscript' | python manage.py shell
raratiru
fonte
Ótima resposta! Eu perdi nos comentários. Obrigado por colocá-lo aqui
Anupam
6

Se você não possui muitos comandos em seu script, use-o:

manage.py shell --command="import django; print(django.__version__)"

Documentos do Django

MrNinjamannn
fonte
4

Como outras respostas indicam, mas não explicitamente, o que você realmente precisa não é necessariamente executar seu script a partir do shell do Django, mas acessar seus aplicativos sem usar o shell do Django .

Isso difere muito a versão do Django da versão do Django. Se você não encontrar sua solução nesse segmento, responda aqui - script do Django para acessar objetos de modelo sem usar o shell manage.py - ou pesquisas semelhantes podem ajudá-lo.

Eu tive que começar meu_command.py com

import os,sys
sys.path.append('/path/to/myproject')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.file")
import django
django.setup()

import project.app.models
#do things with my models, yay

e depois correu python3 my_command.py

(Django 2.0.2)

Simone
fonte
Isso ainda funciona para o Django 3.0. Substituí sys.path.append('/path/to/myproject')por BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))e `sys.path.append (BASE_DIR)`. Também não se esqueça de ativar seu ambiente virtual antes de executar o comando!
mrj 28/01
3
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()
user5121699
fonte
1
Você poderia editar uma explicação de por que esse código responde à pergunta de uma maneira diferente de algumas das respostas anteriores muito semelhantes? As respostas somente de código são desencorajadas , porque não ensinam a solução.
18715 Nathan Tuggy
2

Observe que este método foi descontinuado para versões mais recentes do django! (> 1.3)

Uma resposta alternativa, você pode adicioná-lo ao topo da página. my_script.py

from django.core.management import setup_environ
import settings
setup_environ(settings)

e execute my_script.pyapenas com python no diretório em que você está, settings.pymas isso é um pouco hacky.

$ python my_script.py
danodonovan
fonte
1

Se você quiser encontrar o BG ainda melhor:

nohup echo 'exec(open("my_script.py").read())' | python manage.py shell &

A saída estará em nohup.out

Kevin He
fonte
0

Algo que achei interessante é o Django Scripts, que permite escrever scripts para serem executados com python manage.py runscript foobar. Informações mais detalhadas sobre implementação e estrutura podem ser encontradas aqui, http://django-extensions.readthedocs.org/en/latest/index.html

tseboho
fonte
0

Tente isso se você estiver usando um ambiente virtual: -

shell python manage.py

Para usar esses comandos, você deve estar dentro de um ambiente virtual. para este uso: -

workon vir_env_name

por exemplo :-

dc@dc-comp-4:~/mysite$ workon jango
(jango)dc@dc-comp-4:~/mysite$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Nota : - Aqui mysite é o nome do meu site e jango é o nome do meu ambiente virtual

Rahul Satal
fonte
0

veio aqui com a mesma pergunta que o OP, e eu encontrei minha resposta favorita precisamente no erro dentro da pergunta, que também funciona no Python 3:

./manage.py shell <<EOF
import my_script
my_script.main()
EOF
mariotomo
fonte
0

Por outro lado, execute este:

echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base

Isso está funcionando no Python2.7 e Django1.9

Руслан Руденко
fonte
0

Se você deseja executar o script de inicialização (por exemplo, importe alguns modelos de django para trabalhar com eles interativamente) e permaneça no shell do django:

PYTHONSTARTUP=my_script.py python manage.py shell
Apogentus
fonte
0

O shell django é a boa maneira de executar um módulo python com o ambiente django, mas nem sempre é fácil e cansativo importar módulos e executar funções manualmente, especialmente sem a conclusão automática. Para resolver isso, criei um pequeno script de shell "runscript.sh" que permite tirar o máximo proveito do preenchimento automático e do histórico de log do console do Linux.

NB: Copie o runscript.sh para o projeto raiz e defina a execução correta (chmod + x)

Por exemplo: desejo executar a função python chamada show (a, b, c) no módulo do_somethings.py em myapp / do_folder /

A maneira padrão do django (shell manage.py):

python3 manage.py shell
 > from myapp.do_folder import do_somethings
 > do_somethings.show("p1", "p2"  , 3.14159)

Com script (runscript.sh):

./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159

O script não é limitado em número de argumentos. No entanto, apenas argumentos de tipos primitivos são suportados (int, float, string)

Martin13
fonte
Oi, provavelmente runscriptdo django-extensionspacote faça o mesmo, verifique django-extensions.readthedocs.io/en/latest/runscript.html
frost-nzcr4
Obrigado frost-nzcr4. Sim, de fato, essa extensão funciona, mas eu a acho limitada à pasta srcipts e apenas à função run (). Com o meu srcipt, você pode executar uma função em qualquer lugar de qualquer pasta.
Martin13 16/04
0

Tarde para a festa. Mas isso pode ser útil para alguém.

Tudo que você precisa é o seu script e django-extensions instalado.

Basta executar o shell_plusdisponível emdjango_extensions e importar o script que você escreveu.

Se o seu script estiver scpt.pydentro de uma pasta, folvocê poderá executá-lo da seguinte maneira.

python manage.py shell_plus

e apenas importe seu script dentro do shell da seguinte maneira.

>>> from fol import scpt
Jarvis
fonte
-1

O django.setup () parece não funcionar.

também não parece ser necessário.

só isso funcionou.

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
davidj411
fonte
1
O django.setup () é certamente necessário para inicializar o ambiente do Django.
precisa saber é o seguinte