ฉันต้องการรันสคริปต์ Python จากเชลล์ Django ฉันเหนื่อย:
./manage.py shell << my_script.py
แต่มันไม่ทำงาน มันแค่รอให้ฉันเขียนอะไรสักอย่าง
ฉันต้องการรันสคริปต์ Python จากเชลล์ Django ฉันเหนื่อย:
./manage.py shell << my_script.py
แต่มันไม่ทำงาน มันแค่รอให้ฉันเขียนอะไรสักอย่าง
คำตอบ:
<<
ส่วนหนึ่งเป็นความผิดที่ใช้<
แทน:
$ ./manage.py shell < myscript.py
คุณสามารถทำได้:
$ ./manage.py shell
...
>>> execfile('myscript.py')
สำหรับ python3 คุณจะต้องใช้
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
คือ ฉันพบว่าสิ่งนี้มีประโยชน์สำหรับสคริปต์ที่รวดเร็วและสกปรกซึ่งคุณต้องรันเพียงครั้งเดียวโดยไม่ต้องผ่านขั้นตอนยุ่งยากในการสร้างmanage.py
คำสั่ง
Get-Content myscript.py | .\manage.py shell
คุณไม่ได้แนะนำให้ทำอย่างนั้นจาก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
NoArgsCommand
เลิกใช้แล้ว หน้านี้แสดงตัวอย่างการทำงาน: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
def handle(self, **options):
def handle(self, **options):
เป็นความคิดเห็นของเจมส์
สำหรับทุกคนที่ใช้ 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)
DJANGO_SETTINGS_MODULE
ตัวแปรสภาพแวดล้อม เมื่อถึงตอนนั้นก็เพียงพอแล้วที่จะทำ: import django ; django.setup()
ต่ำกว่า 1.7
django.setup()
จะไม่ปล่อยให้สคริปต์เข้าถึงโมเดล Django หรือแม้แต่นำเข้ามัน!
import django; django.setup()
คุณสามารถเพียง
ฉันมางานปาร์ตี้ช้า แต่หวังว่าคำตอบของฉันจะช่วยใครซักคน: คุณสามารถทำสิ่งนี้ได้ในสคริปต์ Python ของคุณ:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
ส่วนที่เหลือของสิ่งที่คุณไปที่นี่ ....
sys.path.append
สิ่งต่างๆตราบเท่าที่คุณได้รับสิ่งที่DJANGO_SETTINGS_MODULES
ถูกต้อง (เช่นหากคุณมีสคริปต์ที่วางไว้เหนือรูทไซต์ของคุณคุณสามารถทำได้os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
)
sys.path.append(os.getcwd())
ก็ทำงานเมื่อฉันภายในไดเรกทอรีโครงการของฉัน DJANGO_SETTINGS_MODULE ของฉันถูกต้องและผมพยายามที่จะเรียกใช้สคริปต์ว่ารูปแบบการนำเข้า, วิว ฯลฯ
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
django-extensions
(คุณควร) หมายเหตุ: ดูเหมือนว่าrunscript
การใช้ shell
Django มีมาตรฐาน มันจะยอดเยี่ยมถ้ามันใช้shell_plus
(รวมทั้งในส่วนขยาย) ดังนั้นคุณไม่ต้องนำเข้าทุกอย่างเพื่อสคริปต์ง่ายๆ
หากIPythonมีอยู่ ( pip install ipython
) จากนั้น./manage.py shell
จะใช้มันเป็น shell โดยอัตโนมัติและจากนั้นคุณสามารถใช้คำสั่ง magic %run
:
%run my_script.py
runscript
ที่จะทำงานร่วมกับสคริปต์นอกโครงการ / แพ็คเกจและไม่บ่นเช่นนี้TypeError: the 'package' argument is required to perform a relative import for
คุณสามารถรันสคริปต์ด้วยDJANGO_SETTINGS_MODULE
ชุดตัวแปรสภาพแวดล้อม นั่นคือทั้งหมดที่ใช้ในการตั้งค่าสภาพแวดล้อม Django-shell
ใช้งานได้ใน Django> = 1.4
หากคุณมีคำสั่งไม่มากในสคริปต์ให้ใช้:
manage.py shell --command="import django; print(django.__version__)"
ดังที่คำตอบอื่น ๆ ระบุ แต่ไม่ได้ระบุอย่างชัดเจนสิ่งที่คุณอาจจำเป็นต้องมีจริงๆไม่จำเป็นต้องเรียกใช้สคริปต์จากเชลล์ 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)
sys.path.append('/path/to/myproject')
ด้วยBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
และ `sys.path.append (BASE_DIR) ' อย่าลืมเปิดใช้งาน env เสมือนของคุณก่อนดำเนินการคำสั่ง!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
หมายเหตุวิธีนี้เลิกใช้แล้วสำหรับ 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
หากคุณต้องการที่จะทำงานใน BG ที่ดียิ่งขึ้น:
nohup echo 'exec(open("my_script.py").read())' | python manage.py shell &
ผลลัพธ์จะอยู่ใน nohup.out
สิ่งที่ฉันเพิ่งพบว่าน่าสนใจก็คือ Django Scripts ซึ่งช่วยให้คุณเขียนสคริปต์เพื่อให้ทำงานด้วย python manage.py runScript foobar ข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับการนำไปใช้และโครงสร้างย่อยสามารถดูได้ที่นี่http://django-extensions.readthedocs.org/en/latest/index.html
ลองใช้สิ่งนี้หากคุณใช้สภาพแวดล้อมเสมือน: -
งูหลาม 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 เป็นชื่อสิ่งแวดล้อมเสมือนจริงของฉัน
มาที่นี่ด้วยคำถามเดียวกันกับ OP และฉันพบคำตอบที่ฉันโปรดปรานอย่างแม่นยำในความผิดพลาดภายในคำถามซึ่งทำงานใน Python 3 ด้วย:
./manage.py shell <<EOF
import my_script
my_script.main()
EOF
วิธีอื่นก็คือดำเนินการสิ่งนี้:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
สิ่งนี้ใช้ได้กับ Python2.7 และ Django1.9
หากคุณต้องการรันสคริปต์เริ่มต้น (เช่นนำเข้าบางรุ่น django เพื่อทำงานร่วมกับพวกเขาแบบโต้ตอบ) และยังคงอยู่ในเปลือก django:
PYTHONSTARTUP=my_script.py python manage.py shell
เชลล์ 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
ไปงานเลี้ยงสาย แต่นี่อาจเป็นประโยชน์สำหรับใครบางคน
สิ่งที่คุณต้องมีคือสคริปต์และdjango-extensions
ติดตั้ง
เพียงเรียกใช้shell_plus
งานได้ในdjango_extensions
และนำเข้าสคริปต์ที่คุณเขียน
หากสคริปต์ของคุณอยู่scpt.py
ภายในโฟลเดอร์fol
คุณสามารถเรียกใช้สคริปต์ได้ดังนี้
python manage.py shell_plus
และเพียงนำเข้าสคริปต์ของคุณภายในเชลล์ดังนี้
>>> from fol import scpt
django.setup () ดูเหมือนจะไม่ทำงาน
ดูเหมือนจะไม่ต้องการเช่นกัน
สิ่งนี้ใช้ได้ผล
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
ทำงานคุณต้องการทำอะไรจริง ๆ ?