วิธีการรันสคริปต์ Python จากเชลล์ Django


247

ฉันต้องการรันสคริปต์ Python จากเชลล์ 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
Steve Bennett

มันไม่ทำงานอีกต่อไปกับ Python 3+ ความคิดใดที่จะแทนที่สิ่งนี้?
David D.

4
@DavidD คำตอบนี้จะได้รับการแทนที่ที่นี่
peter2108

11
วิธีการแก้ปัญหาอื่น ๆ ที่ปรากฏในการทำงานสำหรับทั้ง 2.x งูหลามและ 3.x echo 'import myscript' | python manage.py shellคือ ฉันพบว่าสิ่งนี้มีประโยชน์สำหรับสคริปต์ที่รวดเร็วและสกปรกซึ่งคุณต้องรันเพียงครั้งเดียวโดยไม่ต้องผ่านขั้นตอนยุ่งยากในการสร้างmanage.pyคำสั่ง
Atul Varma

1
หากคุณกำลังทำสิ่งนี้บนเชลล์พาวเวอร์ Windows: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha

219

คุณไม่ได้แนะนำให้ทำอย่างนั้นจากshell- และนี่มีวัตถุประสงค์เพื่อเป็นคุณไม่ควรจริงๆจะรันสคริปต์สุ่มจากสภาพแวดล้อม Django ( แต่มีมีวิธีการประมาณนี้ดูคำตอบอื่น ๆ )

หากนี่เป็นสคริปต์ที่คุณจะเรียกใช้หลายครั้งคุณควรตั้งค่าเป็นคำสั่งที่กำหนดเองเช่น

 $ ./manage.py my_command

ในการทำเช่นนี้ให้สร้างไฟล์ในส่วนย่อย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):
James

ลิงค์ที่น่าสนใจที่นี่สนับสนุนคำตอบนี้และเอกสารประกอบ
Mattia Paterna

1
เพื่อให้มันทำงานเปลี่ยนdef handle(self, **options):เป็นความคิดเห็นของเจมส์
โอมาร์กอนซาเลส

คำตอบที่สง่างาม ขอบคุณมาก
Tessaracter

103

สำหรับทุกคนที่ใช้ Django 1.7+ ดูเหมือนว่าการนำเข้าโมดูลการตั้งค่านั้นไม่เพียงพอ

หลังจากการขุดฉันพบคำตอบของ Stack Overflow: 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

1
ด้วย Django 1.7+ นี้ควรจะเป็นคำตอบที่ได้รับการยอมรับ :)
acidjunk

นี่คือคำตอบที่ถูกต้องสำหรับ Django 1.9.x ไม่ทำงานdjango.setup()จะไม่ปล่อยให้สคริปต์เข้าถึงโมเดล Django หรือแม้แต่นำเข้ามัน!
glarrain

ใน virtualenv import django; django.setup()คุณสามารถเพียง
User3759685

1
คุณทำวันของฉัน! ขอบคุณสำหรับโพสต์นี้ ฉันกำลังคึกคักบนคื่นฉ่ายเพราะฉันไม่สามารถดำเนินการงานสู่การจัดการ.

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

ฉันสิ้นสุดการทำ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จากdjango-extensions

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-extensions 1.6.7


1
นี่คือคำตอบที่ดีที่สุดถ้าคุณใช้อยู่แล้วdjango-extensions(คุณควร) หมายเหตุ: ดูเหมือนว่าrunscriptการใช้ shellDjango มีมาตรฐาน มันจะยอดเยี่ยมถ้ามันใช้shell_plus(รวมทั้งในส่วนขยาย) ดังนั้นคุณไม่ต้องนำเข้าทุกอย่างเพื่อสคริปต์ง่ายๆ
grokpot

12

หากIPythonมีอยู่ ( pip install ipython) จากนั้น./manage.py shellจะใช้มันเป็น 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ชุดตัวแปรสภาพแวดล้อม นั่นคือทั้งหมดที่ใช้ในการตั้งค่าสภาพแวดล้อม Django-shell

ใช้งานได้ใน Django> = 1.4


7

@AtulVarma ให้ความคิดเห็นที่มีประโยชน์มากภายใต้คำตอบที่ไม่ทำงาน:

echo 'import myscript' | python manage.py shell

คำตอบที่ดี! ฉันคิดถึงมันในความคิดเห็น ขอบคุณสำหรับการวางที่นี่
Anupam


4

ดังที่คำตอบอื่น ๆ ระบุ แต่ไม่ได้ระบุอย่างชัดเจนสิ่งที่คุณอาจจำเป็นต้องมีจริงๆไม่จำเป็นต้องเรียกใช้สคริปต์จากเชลล์ Django แต่เพื่อเข้าถึงแอปของคุณโดยไม่ต้องใช้เชลล์ Djangoเปลือก

สิ่งนี้แตกต่างจากรุ่น Django มากเป็นรุ่น Django หากคุณไม่พบวิธีแก้ไขปัญหาของคุณในชุดคำตอบให้ตอบที่นี่ - สคริปต์ Django เพื่อเข้าถึงออบเจ็กต์โมเดลโดยไม่ต้องใช้เชลล์ Manage.py - หรือการค้นหาที่คล้ายกันอาจช่วยคุณได้

ฉันต้องเริ่ม 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) ' อย่าลืมเปิดใช้งาน env เสมือนของคุณก่อนดำเนินการคำสั่ง!
mrj

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

django.setup()

1
คุณกรุณาแก้ไขด้วยคำอธิบายว่าทำไมรหัสนี้ตอบคำถามในลักษณะที่แตกต่างจากคำตอบก่อนหน้านี้ที่คล้ายกันมากหรือไม่ คำตอบที่ไม่ใช้รหัสเท่านั้นไม่มีกำลังใจเพราะพวกเขาไม่ได้สอนวิธีแก้ปัญหา
นาธาน Tuggy

2

หมายเหตุวิธีนี้เลิกใช้แล้วสำหรับ django เวอร์ชันล่าสุด! (> 1.3)

คุณสามารถเพิ่มคำตอบนี้ไปที่ด้านบนของ my_script.py

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

และรันmy_script.pyด้วย python ในไดเร็กตอรี่ที่คุณมีsettings.pyแต่มันค่อนข้างแฮ็ก

$ python my_script.py

1

หากคุณต้องการที่จะทำงานใน BG ที่ดียิ่งขึ้น:

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

ผลลัพธ์จะอยู่ใน nohup.out


0

สิ่งที่ฉันเพิ่งพบว่าน่าสนใจก็คือ Django Scripts ซึ่งช่วยให้คุณเขียนสคริปต์เพื่อให้ทำงานด้วย python manage.py runScript foobar ข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับการนำไปใช้และโครงสร้างย่อยสามารถดูได้ที่นี่http://django-extensions.readthedocs.org/en/latest/index.html


0

ลองใช้สิ่งนี้หากคุณใช้สภาพแวดล้อมเสมือน: -

งูหลาม 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 และฉันพบคำตอบที่ฉันโปรดปรานอย่างแม่นยำในความผิดพลาดภายในคำถามซึ่งทำงานใน Python 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 แต่มันไม่ง่ายและน่าเบื่อที่จะนำเข้าโมดูลและใช้งานฟังก์ชั่นด้วยตนเองโดยเฉพาะอย่างยิ่งโดยไม่ต้องทำให้สมบูรณ์อัตโนมัติ เพื่อแก้ไขปัญหานี้ฉันได้สร้างเชลล์สคริปต์ขนาดเล็ก"runcript.sh"ที่ช่วยให้คุณใช้ประโยชน์จากการเติมข้อมูลอัตโนมัติและประวัติบันทึกของคอนโซล Linux

NB: คัดลอก runcript.sh ไปยังโครงการรูทและตั้งค่าสิทธิในการใช้งาน (chmod + x)

ตัวอย่างเช่นฉันต้องการเรียกใช้ฟังก์ชัน python ชื่อ show (a, b, c) ในโมดูล do_somethings.py ใน myapp / do_folder /

วิธี django มาตรฐาน (เชลล์ Manage.py):

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

ด้วยสคริปต์ (runcript.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
frost-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.