कैसे Django के खोल से एक पायथन स्क्रिप्ट निष्पादित करने के लिए?


247

मुझे Django शेल से पायथन स्क्रिप्ट निष्पादित करने की आवश्यकता है। मैंने कोशिश की:

./manage.py shell << my_script.py

लेकिन यह काम नहीं किया। बस मुझे कुछ लिखने का इंतजार था।


यह नहीं है कि कैसे djangoकाम करता है, आप वास्तव में क्या करना चाहते हैं?
danodonovan

2
my_script.pyमेरे एक Django मॉडल पर कुछ ऑपरेशन शामिल हैं। मैंने पहले भी ऐसा किया है, लेकिन मुझे याद नहीं है कि वास्तव में कैसे।

जवाबों:


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
स्टीव बेनेट

यह पायथन 3+ के साथ अब और काम नहीं करता है। इसे बदलने के लिए कोई विचार?
डेविड डी।

4
@DavidD। प्रतिस्थापन इस उत्तर में दिया गया है
peter2108

11
एक और समाधान जो पायथन 2.x और 3.x दोनों के लिए काम करता प्रतीत होता है echo 'import myscript' | python manage.py shell। मैंने पाया है कि यह त्वरित-और गंदी लिपियों के लिए उपयोगी हो सकता है जिन्हें आपको केवल एक बार चलाने की आवश्यकता होती है, बिना manage.pyकमांड बनाने की बोझिल प्रक्रिया के माध्यम से जाने के लिए ।
अतुल वर्मा

1
अगर आप इसे विंडोज पावर शेल पर कर रहे हैं: Get-Content myscript.py | .\manage.py shell
आदित्य विरुध

219

आपको ऐसा करने की अनुशंसा नहीं की गई है shell- और इसका उद्देश्य यह है कि आप वास्तव में django परिवेश से यादृच्छिक स्क्रिप्ट निष्पादित नहीं कर रहे हैं (लेकिन इसके चारों ओर तरीके हैं, अन्य उत्तर देखें)।

इस एक स्क्रिप्ट है कि आप कई बार चल रहा है हो जाएगा, तो यह एक अच्छा विचार एक के रूप में सेट अप करने के लिए कस्टम आदेश यानी

 $ ./manage.py my_command

यह करने के लिए की एक subdir में एक फ़ाइल बनाने managementऔर commandsअपने की 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):
जेम्स

इस जवाब और प्रलेखन के समर्थन में यहाँ दिलचस्प लिंक ।
मटिया पटेना

1
def handle(self, **options):जेम्स की टिप्पणी के रूप में परिवर्तन के लिए इसे प्राप्त करने के लिए ।
उमर गोंजालेस

सुरुचिपूर्ण उत्तर। बहुत बहुत धन्यवाद
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 प्रोजेक्ट के समान निर्देशिका में है (जैसे कि प्रबंधन के समान फ़ोल्डर में।)


2
मेरे सेटअप में DJANGO_SETTINGS_MODULEपर्यावरण चर में पहले से संदर्भित सेटिंग्स फ़ाइल है । इसके साथ यह सिर्फ 1 के लिए पर्याप्त था: import django ; django.setup()1.7 के तहत।
टेलर एड्मिस्टन

1
Django 1.7+ के साथ यह स्वीकृत उत्तर होना चाहिए :)
acidjunk

यह निश्चित रूप से Django 1.9.x के लिए सही उत्तर है। नहीं चल रहा django.setup()है स्क्रिप्ट को Django मॉडल का उपयोग नहीं करने देगा, उन्हें आयात भी नहीं करेगा!
चमक

एक virtualenv में आप बस कर सकते हैं import django; django.setup()
उपयोगकर्ता 3759685

1
आपने मेरा दिन बना दिया! इस पोस्ट के लिए धन्यवाद। मैं अजवाइन पर लापरवाह हो रहा था क्योंकि मैं प्रबंधन पर कार्यों को

68

मुझे पार्टी के लिए देर हो रही है लेकिन मुझे उम्मीद है कि मेरी प्रतिक्रिया से किसी को मदद मिलेगी: आप इसे अपनी पायथन स्क्रिप्ट में कर सकते हैं:

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')।
मंगल

मैंने काम करना समाप्त कर दिया sys.path.append(os.getcwd()), यह तब काम करता है जब मैं अपनी परियोजना निर्देशिका के अंदर होता हूं, मेरा DJANGO_SETTINGS_MODULE सही है और मैं एक स्क्रिप्ट चलाने की कोशिश करता हूं जो मॉडल, दृश्य आदि आयात करता है
Danilo Cabello

हाँ, लेकिन आप इसे कहीं से भी नहीं चला सकते हैं!
ई-नूरी

यह मेरे लिए django 1.6 के साथ काम नहीं करता है - मेरे पास एक ऐप है। मैंने django प्रोजेक्ट डायरेक्टरी को शामिल करने और प्रोजेक्ट सेटिंग्स सेट करने के लिए अपना रास्ता निर्धारित किया है। लेकिन जब मैं अपने ऐप को "शॉर्टलिस्ट.मॉडल से शापिंगलिस्ट आयात करता हूं" के साथ आयात करने की कोशिश करता हूं, तो मुझे एक त्रुटि दी जाती है कि यह मॉडल नहीं मिल सकता है। वही आयात लाइन प्रबंध शेल के भीतर से काम करती है। कोई विचार?
फ्रेंकस्टर

33

runscriptसे Django-एक्सटेंशन

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

एक ट्यूटोरियल भी है

Django 1.9.6 पर परीक्षण किया गया, django- एक्सटेंशन 1.6.7।


1
यह सबसे अच्छा जवाब है यदि आप पहले से ही उपयोग कर रहे हैं django-extensions(आपको चाहिए)। नोट: ऐसा लगता है runscriptकि मानक django का उपयोग करता है shell। यह शानदार होगा यदि यह shell_plus(एक्सटेंशन में भी) का उपयोग करता है तो आपको सरल स्क्रिप्ट के लिए सब कुछ आयात करने की आवश्यकता नहीं थी।
grokpot

12

यदि IPython उपलब्ध है ( pip install ipython) तो ./manage.py shellस्वचालित रूप से शेल का उपयोग करेगा और फिर आप मैजिक कमांड का उपयोग कर सकते हैं %run:

%run my_script.py

एक जादू की तरह काम किया!
Roel

इसका यह फायदा है runscriptकि यह प्रोजेक्ट / पैकेज के बाहर स्क्रिप्ट के साथ काम करता है और इस तरह की शिकायत नहीं करता हैTypeError: the 'package' argument is required to perform a relative import for
smido

8

आप स्क्रिप्ट को DJANGO_SETTINGS_MODULEपर्यावरण चर सेट के साथ चला सकते हैं । यह सब Django खोल पर्यावरण स्थापित करने के लिए लेता है।

यह Django> = 1.4 में काम करता है


7

@AtulVarma ने काम नहीं किए गए स्वीकृत उत्तर के तहत बहुत उपयोगी टिप्पणी प्रदान की :

echo 'import myscript' | python manage.py shell

बहुत बढ़िया जवाब! मैंने इसे टिप्पणियों में याद किया। इसे यहाँ रखने के लिए धन्यवाद
अनुपम '’

6

यदि आपकी स्क्रिप्ट में बहुत सारी कमांड नहीं हैं, तो इसका उपयोग करें:

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

Django डॉक्स


4

जैसा कि अन्य उत्तर इंगित करते हैं, लेकिन स्पष्ट रूप से नहीं बताते हैं, जो आपको वास्तव में आवश्यकता हो सकती है वह जरूरी नहीं है कि आप अपनी स्क्रिप्ट को Django शेल से निष्पादित करें, लेकिन अपने ऐप्स को Django शेल का उपयोग किए बिना एक्सेस करने के लिए ।

यह Django संस्करण के लिए एक बहुत Django संस्करण अलग है। यदि आप इस थ्रेड पर अपना समाधान नहीं ढूंढते हैं, तो यहां जवाब दें - 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

(Django 2.0.2)


यह अभी भी Django 3.0 के लिए काम करता है। मैं प्रतिस्थापित sys.path.append('/path/to/myproject')साथ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))और `sys.path.append (BASE_DIR)`। कमांड को निष्पादित करने से पहले अपने वर्चुअल एनवी को सक्रिय करना न भूलें!
MRJ

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

django.setup()

1
क्या आप इस स्पष्टीकरण में संपादित कर सकते हैं कि यह कोड इस तरह से प्रश्न का उत्तर क्यों देता है, जो पहले के कुछ समान उत्तरों से भिन्न है? कोड-केवल उत्तर हतोत्साहित किए जाते हैं , क्योंकि वे समाधान नहीं सिखाते हैं।
नाथन तुग्गी

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

यदि आप बेहतर तरीके से बीजी में चलाना चाहते हैं:

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

में आउटपुट होगा nohup.out


0

जो कुछ मुझे अभी दिलचस्प लगा वह है Django लिपियों, जो आपको स्क्रिप्ट लिखने के लिए python के साथ चलने के लिए प्रबंधित करता है। कार्यान्वयन और फ्रैक्चर के बारे में अधिक विस्तृत जानकारी यहां पाई जा सकती है, http://django-extensions.readthedocs.org/en/latest/index.html


0

यदि आप आभासी वातावरण का उपयोग कर रहे हैं, तो यह कोशिश करें: -

अजगर प्रबंधन शेल्फ़

उन आदेशों का उपयोग करने के लिए आपको आभासी वातावरण के अंदर होना चाहिए। इस उपयोग के लिए: -

वर्कऑन 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

ओपी के रूप में एक ही सवाल के साथ यहां आया था, और मुझे इस प्रश्न के भीतर गलती से मेरा पसंदीदा उत्तर मिला, जो पायथन में भी काम करता है:

./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 पर्यावरण के साथ एक अजगर मॉड्यूल को निष्पादित करने का एक अच्छा तरीका है, लेकिन मॉड्यूल को आयात करना और विशेष रूप से ऑटो-पूर्ण किए बिना मैन्युअल रूप से फ़ंक्शन निष्पादित करना हमेशा आसान और थकाऊ नहीं होता है। इसे हल करने के लिए, मैंने एक छोटी सी शेल स्क्रिप्ट "रनस्क्रिप्ट.श" बनाई जो आपको ऑटो-पूर्णता और लिनक्स कंसोल के लॉग इतिहास का पूरा लाभ उठाने की अनुमति देती है।

NB: रूट परियोजना के लिए copycript.sh कॉपी करें और निष्पादन को सही सेट करें (chmod + x)

उदाहरण के लिए: मैं myapp / do_folder / में मॉड्यूल do_somethings.py में शो (a, b, c) नाम का पायथन फ़ंक्शन चलाना चाहता हूं।

मानक django तरीका (प्रबंधन शेल):

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

स्क्रिप्ट के साथ (चलाता)

./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

धन्यवाद ठंढा- nzcr4 हां, वास्तव में, यह एक्सटेंशन काम करता है, लेकिन मुझे यह केवल फ़ोल्डर और केवल रन () फ़ंक्शन तक सीमित लगता है। मेरे क्रिप्ट के साथ, आप किसी भी फ़ोल्डर में कहीं भी फ़ंक्शन निष्पादित कर सकते हैं।
मार्टिन

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.