Django 쉘에서 Python 스크립트를 실행하는 방법은 무엇입니까?


247

Django 쉘에서 Python 스크립트를 실행해야합니다. 나는 시도했다 :

./manage.py shell << my_script.py

그러나 작동하지 않았습니다. 내가 무언가를 쓰려고 기다리고있었습니다.


이것은 django작동 방식 이 아니며 실제로 무엇을하고 싶습니까?
danodonovan

2
my_script.pyDjango 모델 중 하나에 대한 몇 가지 작업이 포함되어 있습니다. 나는 이미 전에 이것을했지만 얼마나 정확하게 기억할 수 없습니다.

답변:


388

<<부분이 잘못 사용 <하는 대신 :

$ ./manage.py shell < myscript.py

당신은 또한 할 수 있습니다 :

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

python3의 경우 사용해야합니다

>>> exec(open('myscript.py').read())

17
나에게 이것은 스크립트의 첫 번째 줄만 실행합니다. 작동하는 유일한 방법은 두 가지 방법을 결합하는 것입니다../manage.py shell <<EOF\ execfile('myscript.py') \EOF
Steve Bennett

Python 3 이상에서는 더 이상 작동하지 않습니다. 이것을 대체 할 생각이 있습니까?
David D.

4
@DavidD. 이 답변에 대체 내용이 있습니다.
peter2108

11
Python 2.x 및 3.x에서 모두 작동하는 것으로 보이는 또 다른 솔루션은 echo 'import myscript' | python manage.py shell입니다. 나는 이것이 manage.py명령 을 작성하는 번거로운 과정을 거치지 않고 한 번만 실행하면되는 빠르고 더러운 스크립트에 유용 할 수 있음을 발견했습니다 .
Atul Varma 2016 년

1
Windows power shell에서이 작업을 수행하는 경우 : Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha

219

당신은에서 그렇게하지 않는 것이 좋습니다있어 shell- 당신은 정말 장고 환경에서 임의의 스크립트를 실행해야합니다으로이 것입니다 (하지만 거기에 있다 , 다른 답변을 볼이 주위 방법).

이것은 당신이 여러 번 실행됩니다 스크립트가 있다면, 그것은 좋은 생각은로 설정의 사용자 지정 명령 , 즉

 $ ./manage.py my_command

이 작업을 수행하는 것은의 하위 디렉터리에있는 파일 생성 managementcommands사용자의 app, 즉

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

이 파일에서 사용자 정의 명령을 정의하십시오 (파일 이름이에서 실행하려는 명령의 이름인지 확인하십시오 ./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

9
다시 이것은 가장 좋은 대답입니다. django 1.8 NoArgsCommand은 더 이상 사용되지 않습니다. 이 페이지는 실제 예제입니다 : docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
Ger

2
이전 의견에 따르면, 나를 위해 작동하려면로 변경 def handle_noargs(self, **options):해야했습니다 def handle(self, **options):.
James

이 답변과 설명서를 지원하는 흥미로운 링크가 있습니다 .
Mattia Paterna

1
작동하려면 def handle(self, **options):James의 의견으로 변경하십시오 .
Omar Gonzales

우아한 대답. 고마워
Tessaracter

103

Django 1.7 이상을 사용하는 사람이라면 단순히 설정 모듈을 가져 오는 것만으로는 충분하지 않은 것 같습니다.

약간의 파기 후이 스택 오버플로 답변을 발견했습니다. https://stackoverflow.com/a/23241093

이제 다음을 수행해야합니다.

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

위의 작업을 수행하지 않으면 django.core.exceptions.AppRegistryNoReady오류가 발생했습니다.

내 스크립트 파일은 django 프로젝트와 같은 디렉토리에 있습니다 (즉, manage.py와 같은 폴더에 있습니다)


2
설정에 DJANGO_SETTINGS_MODULE환경 변수 에서 이미 설정 파일이 참조되어 있습니다. 그것으로 충분했습니다 : import django ; django.setup()1.7 미만.
Taylor Edmiston 2016 년

1
django 1.7+를 사용하면 이것이 정답 일 것입니다 :)
acidjunk

이것은 장고 1.9.x에 대한 정답입니다. 실행 django.setup()하지 않으면 스크립트가 Django 모델에 액세스 할 수 없으며 가져 오기조차 할 수 없습니다!
glarrain

virtualenv에서는 간단히 할 수 있습니다 import django; django.setup().
User3759685

1
당신은 내 하루를했다! 이 게시물에 감사드립니다. 관리에 작업을 실행할 수 없기 때문에 셀러리에 끔찍한 느낌이 들었습니다 .call_command : D : D : D

68

나는 파티에 늦었지만 내 응답이 누군가를 도울 수 있기를 바랍니다. Python 스크립트 에서이 작업을 수행 할 수 있습니다.

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

당신의 물건의 나머지는 여기에 간다 ....


3
또한 올바른 위치에있는 sys.path.append동안 물건을 떨어 뜨릴 수 있습니다 DJANGO_SETTINGS_MODULES(예 : 사이트 루트 바로 위에 스크립트가있는 경우 수행 할 수 있음 os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings').
mgalgs 5

나는 sys.path.append(os.getcwd())프로젝트 디렉토리 안에있을 때 작동하며, DJANGO_SETTINGS_MODULE이 정확하고 모델, 뷰 등을 가져 오는 스크립트를 실행하려고합니다.
Danilo Cabello

예, 그러나 어디서나 실행할 수 없습니다!
e-nouri

django 1.6에서는 작동하지 않습니다-앱이 있습니다. django 프로젝트 디렉토리를 포함하도록 경로를 설정하고 프로젝트 설정을 설정했습니다. 그러나 "from shoppinglist.models import ShoppingList"를 사용하여 앱을 가져 오려고 시도하면 모델을 찾을 수 없다는 오류가 표시됩니다. 동일한 가져 오기 줄이 manage.py 셸 내에서 작동합니다. 어떤 아이디어?
frankster

33

runscript에서 장고 - 확장

python manage.py runscript scripty.py

script.py테스트 할 샘플 :

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

http://django-extensions.readthedocs.io/en/latest/command_extensions.html에 언급되어 있으며 다음에 문서화되어 있습니다.

python manage.py runscript --help

튜토리얼도 있습니다 .

장고 1.9.6, 장고 확장 1.6.7에서 테스트되었습니다.


1
이것은 이미 사용하고 있다면 가장 좋은 대답 django-extensions입니다. 참고 : runscript표준 django를 사용하는 것 같습니다 shell. shell_plus확장명으로도 사용하면 환상적 이므로 간단한 스크립트를 위해 모든 것을 가져올 필요는 없습니다.
grokpot

12

IPython 을 사용할 수 있으면 ( pip install ipython) ./manage.py shell자동으로 쉘을 사용하고 magic 명령을 사용할 수 있습니다 %run.

%run my_script.py

매력처럼 일했다!
Roel

이것은 runscript프로젝트 / 패키지 외부의 스크립트와 함께 작동하며 다음과 같이 불평하지 않는 것보다 이점 이 있습니다TypeError: the 'package' argument is required to perform a relative import for
smido

8

DJANGO_SETTINGS_MODULE환경 변수 세트로 스크립트를 실행할 수 있습니다 . 그것이 장고 쉘 환경을 설정하는 데 필요한 전부입니다.

이것은 장고> = 1.4에서 작동합니다.


7

@AtulVarma는 작동하지 않는 대답 으로 매우 유용한 의견을 제시했습니다 .

echo 'import myscript' | python manage.py shell

좋은 답변입니다! 의견에서 그것을 놓쳤다. 여기에 넣어 주셔서 감사합니다
Anupam

6

스크립트에 많은 명령이 없으면 사용하십시오.

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

장고 문서


4

다른 답변에서 알 수 있지만 명시 적으로 명시하지는 않지만 실제로 필요한 것은 Django 셸에서 스크립트를 실행하는 것이 아니라 Django 셸 을 사용하지 않고 앱에 액세스하는 것 입니다.

이것은 장고 버전과 장고 버전이 다릅니다. 이 스레드에서 솔루션을 찾지 못하면 여기에 대답하십시오 -manage.py 셸을 사용하지 않고 모델 객체에 액세스하는 Django 스크립트 또는 유사한 검색이 도움이 될 수 있습니다.

나는 my_command.py를 시작해야했다.

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

그리고 달렸다 python3 my_command.py

(장고 2.0.2)


이것은 여전히 ​​Django 3.0에서 작동합니다. 그리고`sys.path.append (BASE_DIR)` 로 교체 sys.path.append('/path/to/myproject')했습니다 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))). 또한 명령을 실행하기 전에 가상 환경을 활성화하는 것을 잊지 마십시오!
mrj

3
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()

1
당신은 기쁘게 할 수 편집 이 코드는 매우 유사 이전 답변의 일부에서 다르다 방식으로 질문에 대한 답 이유에 대한 설명에? 코드 전용 답변은 솔루션을 가르치지 않기 때문에 권장 하지 않습니다.
Nathan Tuggy

2

이 방법은 최신 버전의 django에서 더 이상 사용되지 않습니다! (> 1.3)

다른 대답은 이것을 맨 위에 추가 할 수 있습니다. my_script.py

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

그리고 my_script.py당신이있는 디렉토리에서 파이썬으로 그냥 실행 settings.py하지만 이것은 약간 해키입니다.

$ python my_script.py

1

BG에서 더 뛰어나고 싶다면 :

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

출력은 nohup.out



0

가상 환경을 사용하는 경우 이것을 시도하십시오 :-

python manage.py 셸

해당 명령을 사용하려면 가상 환경 내부에 있어야합니다. 이 사용을 위해 :-

workon vir_env_name

예를 들어 :-

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)
>>> 

참고 :-여기 mysite는 내 웹 사이트 이름이고 jango는 내 가상 환경 이름입니다.


0

OP와 같은 질문으로 여기에 왔으며 파이썬 3에서도 작동하는 질문 내 실수에서 내가 가장 좋아하는 대답을 찾았습니다.

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

0

다른 방법으로 이것을 실행하십시오 :

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

이것은 Python2.7 및 Django1.9에서 작동합니다.


0

시작 스크립트를 실행하려면 (예 : 일부 django 모델을 가져와 대화식으로 작업) django 셸에 남아있는 경우 :

PYTHONSTARTUP=my_script.py python manage.py shell

0

django 쉘은 django 환경에서 파이썬 모듈을 실행하는 좋은 방법이지만 모듈을 가져오고 특히 자동 완성없이 수동으로 함수를 실행하는 것이 항상 쉽고 피곤하지는 않습니다. 이 문제를 해결하기 위해 Linux 콘솔의 자동 완성 및 로그 기록을 최대한 활용할 수 있는 작은 셸 스크립트 "runscript.sh" 를 만들었습니다 .

NB : runscript.sh를 루트 프로젝트에 복사하고 실행 권한을 설정하십시오 (chmod + x).

예를 들어 : myapp / do_folder /의 do_somethings.py 모듈에서 show (a, b, c)라는 파이썬 함수를 실행하고 싶습니다.

표준 장고 방식 (manage.py shell) :

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

스크립트 사용 (runscript.sh) :

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

스크립트는 인수 수에 제한이 없습니다. 그러나 기본 유형의 인수 만 지원됩니다 (int, float, string)


안녕, 아마 runscript에서 django-extensions패키지가 동일한 확인합니까 django-extensions.readthedocs.io/en/latest/runscript.html
서리 nzcr4

frost-nzcr4 감사합니다. 예, 실제로이 확장은 작동하지만 srcipts 폴더와 run () 함수로만 제한됩니다. 내 srcipt를 사용하면 모든 폴더의 어느 곳에서나 함수를 실행할 수 있습니다.
Martin13

0

파티에 늦었다. 그러나 이것은 누군가에게 도움이 될 수 있습니다.

스크립트 만 django-extensions설치하면됩니다.

에서 shell_plus사용 가능한django_extensions 스크립트를 작성한 스크립트를 가져 오십시오.

스크립트가 scpt.py폴더 안에 fol있으면 다음과 같이 스크립트를 실행할 수 있습니다.

python manage.py shell_plus

다음과 같이 셸 내에서 스크립트를 가져옵니다.

>>> from fol import scpt

-1

django.setup ()이 작동하지 않는 것 같습니다.

필요하지 않은 것 같습니다.

이것만으로도 효과가있었습니다.

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")

1
django.setup ()은 Django 환경을 부트 스트랩하는 데 가장 필요합니다.
colm.anseo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.