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.
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.
Respostas:
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())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
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.py
comando.
Get-Content myscript.py | .\manage.py shell
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 management
e commands
de 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
NoArgsCommand
está obsoleto. Esta página fornece um exemplo de trabalho: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
para def handle(self, **options):
.
def handle(self, **options):
o comentário de James.
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.AppRegistryNoReady
erro.
Meu arquivo de script está no mesmo diretório que meu projeto django (ou seja, na mesma pasta que manage.py)
DJANGO_SETTINGS_MODULE
variável de ambiente. Com isso, bastava: import django ; django.setup()
abaixo de 1,7.
django.setup()
não permitirá que o script acesse os modelos do Django, nem os importe!
import django; django.setup()
.
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 ....
sys.path.append
coisas desde que esteja DJANGO_SETTINGS_MODULES
certo (por exemplo, se você tiver um script logo acima da raiz do site, poderá fazê-lo os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
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.
runscript
de django-extensões
python manage.py runscript scripty.py
Uma amostra script.py
para 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
Testado no Django 1.9.6, django-extensions 1.6.7.
django-extensions
(você deveria). Nota: Parece que runscript
usa 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.
Se o IPython estiver disponível (pip install ipython
), ele ./manage.py shell
usará automaticamente seu shell e você poderá usar o comando magic %run
:
%run my_script.py
runscript
funcionar com scripts fora do projeto / pacote e não se queixar assimTypeError: the 'package' argument is required to perform a relative import for
Você pode simplesmente executar o script com a DJANGO_SETTINGS_MODULE
variável de ambiente definida. Isso é tudo o que é necessário para configurar o ambiente do Django-shell.
Isso funciona no Django> = 1.4
O @AtulVarma forneceu um comentário muito útil sob a resposta aceita que não funciona :
echo 'import myscript' | python manage.py shell
Se você não possui muitos comandos em seu script, use-o:
manage.py shell --command="import django; print(django.__version__)"
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)
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!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
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.py
apenas com python no diretório em que você está, settings.py
mas isso é um pouco hacky.
$ python my_script.py
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
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
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
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)
runscript
do django-extensions
pacote faça o mesmo, verifique django-extensions.readthedocs.io/en/latest/runscript.html
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_plus
disponível emdjango_extensions
e importar o script que você escreveu.
Se o seu script estiver scpt.py
dentro de uma pasta, fol
você 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
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")
django
funciona, o que você realmente quer fazer?