Tôi cần phải thực thi một tập lệnh Python từ trình bao Django. Tôi đã thử:
./manage.py shell << my_script.py
Nhưng nó không hoạt động. Nó chỉ chờ tôi viết một cái gì đó.
Tôi cần phải thực thi một tập lệnh Python từ trình bao Django. Tôi đã thử:
./manage.py shell << my_script.py
Nhưng nó không hoạt động. Nó chỉ chờ tôi viết một cái gì đó.
Câu trả lời:
Phần <<
sai, sử dụng <
thay thế:
$ ./manage.py shell < myscript.py
Bạn cũng có thể làm:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Đối với python3, bạn sẽ cần sử dụng
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
. Tôi đã thấy điều này có thể hữu ích cho các tập lệnh nhanh và bẩn mà bạn chỉ cần chạy một lần mà không phải trải qua quá trình tạo manage.py
lệnh rườm rà .
Get-Content myscript.py | .\manage.py shell
Bạn không nên làm điều đó từ shell
- và điều này được dự định vì bạn thực sự không nên thực thi các tập lệnh ngẫu nhiên từ môi trường django (nhưng có nhiều cách khác, hãy xem các câu trả lời khác).
Nếu đây là tập lệnh mà bạn sẽ chạy nhiều lần, bạn nên thiết lập tập lệnh này dưới dạng lệnh tùy chỉnh, tức là
$ ./manage.py my_command
để làm điều này tạo ra một tập tin trong một subdir của management
và commands
của bạn app
, ví dụ:
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
và trong tệp này xác định lệnh tùy chỉnh của bạn (đảm bảo rằng tên của tệp là tên của lệnh bạn muốn thực hiện ./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
không được dùng nữa. Trang này đưa ra một ví dụ hoạt động: docs.djangoproject.com/en/1.9/howto/custom-manloyment-commands/ chủ
def handle_noargs(self, **options):
để def handle(self, **options):
.
def handle(self, **options):
như nhận xét của James.
Đối với bất kỳ ai sử dụng Django 1.7+, có vẻ như chỉ cần nhập mô-đun cài đặt là không đủ.
Sau khi đào bới, tôi đã tìm thấy câu trả lời Stack Overflow này: https://stackoverflow.com/a/23241093
Bây giờ bạn cần phải:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Không làm như trên, tôi đã nhận được một django.core.exceptions.AppRegistryNoReady
lỗi.
Tệp tập lệnh của tôi nằm trong cùng thư mục với dự án django của tôi (nghĩa là trong cùng thư mục với Manage.py)
DJANGO_SETTINGS_MODULE
biến môi trường. Với điều đó là đủ để chỉ: import django ; django.setup()
dưới 1.7.
django.setup()
sẽ không cho phép tập lệnh truy cập vào các mô hình Django, thậm chí không nhập chúng!
import django; django.setup()
.
Tôi đến bữa tiệc muộn nhưng tôi hy vọng rằng phản hồi của tôi sẽ giúp được ai đó: Bạn có thể làm điều này trong tập lệnh Python của mình:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
phần còn lại của công cụ của bạn ở đây ....
sys.path.append
nội dung miễn là bạn hiểu DJANGO_SETTINGS_MODULES
đúng (ví dụ: nếu bạn có một tập lệnh nằm ngay phía trên trang web gốc của bạn, bạn có thể làm os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
sys.path.append(os.getcwd())
, nó hoạt động khi tôi ở trong thư mục dự án của mình, DJANGO_SETTINGS_MODULE của tôi là chính xác và tôi cố gắng chạy một kịch bản nhập mô hình, lượt xem, v.v.
runscript
từ phần mở rộng django
python manage.py runscript scripty.py
Một mẫu script.py
để kiểm tra nó:
from django.contrib.auth.models import User
print(User.objects.values())
Được đề cập tại: http://django-extensions.readthedocs.io/en/latest/command_extensions.html và được ghi lại tại:
python manage.py runscript --help
Đã thử nghiệm trên Django 1.9.6, django-phần mở rộng 1.6.7.
django-extensions
(bạn nên). Lưu ý: Có vẻ như runscript
sử dụng django tiêu chuẩn shell
. Sẽ thật tuyệt vời nếu nó được sử dụng shell_plus
(cũng trong các tiện ích mở rộng) vì vậy bạn không phải nhập mọi thứ cho các tập lệnh đơn giản.
Nếu IPython có sẵn ( pip install ipython
) thì ./manage.py shell
sẽ tự động sử dụng shell của nó và sau đó bạn có thể sử dụng lệnh ma thuật %run
:
%run my_script.py
runscript
là nó hoạt động với các tập lệnh bên ngoài dự án / gói và không phàn nàn như thế nàyTypeError: the 'package' argument is required to perform a relative import for
Bạn chỉ có thể chạy tập lệnh với bộ DJANGO_SETTINGS_MODULE
biến môi trường. Đó là tất cả những gì cần thiết để thiết lập môi trường Django-shell.
Điều này hoạt động trong Django> = 1,4
@AtulVarma cung cấp một nhận xét rất hữu ích theo câu trả lời không được chấp nhận :
echo 'import myscript' | python manage.py shell
nếu bạn không có nhiều lệnh trong tập lệnh của mình, hãy sử dụng nó:
manage.py shell --command="import django; print(django.__version__)"
Như các câu trả lời khác chỉ ra nhưng không nói rõ, những gì bạn thực sự cần không nhất thiết phải thực thi tập lệnh của bạn từ trình bao Django, mà là để truy cập các ứng dụng của bạn mà không cần sử dụng trình bao Django .
Điều này khác rất nhiều phiên bản Django so với phiên bản Django. Nếu bạn không tìm thấy giải pháp của mình trên chuỗi này, hãy trả lời tại đây - tập lệnh Django để truy cập các đối tượng mô hình mà không cần sử dụng trình quản lý shell - hoặc các tìm kiếm tương tự có thể giúp bạn.
Tôi đã phải bắt đầu my_command.py với
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
và sau đó chạy python3 my_command.py
(Django 2.0.2)
sys.path.append('/path/to/myproject')
bằng BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
và `sys.path.append (BASE_DIR)`. Cũng đừng quên kích hoạt env ảo của bạn trước khi thực hiện lệnh!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
Lưu ý, phương pháp này đã không được chấp nhận cho các phiên bản gần đây của django! (> 1.3)
Một câu trả lời khác, bạn có thể thêm nó vào đầu my_script.py
from django.core.management import setup_environ
import settings
setup_environ(settings)
và thực hiện my_script.py
chỉ với python trong thư mục mà bạn có settings.py
nhưng đây là một chút hack.
$ python my_script.py
Một cái gì đó tôi vừa thấy thú vị là Django Sc scripts, cho phép bạn viết các kịch bản để được chạy với python Manage.txt runcript foobar. Thông tin chi tiết về triển khai và cơ cấu có thể được tìm thấy ở đây, http://django-extensions.readthedocs.org/en/latest/index.html
Hãy thử điều này nếu bạn đang sử dụng môi trường ảo: -
python quản lý shell
để sử dụng các lệnh đó, bạn phải ở trong môi trường ảo. cho việc sử dụng này: -
làm việc vir_env_name
ví dụ :-
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)
>>>
Lưu ý : - Ở đây mysite là tên trang web của tôi và jango là tên môi trường ảo của tôi
Trình bao django là cách tốt để thực thi mô-đun python với môi trường django, nhưng không phải lúc nào cũng dễ dàng và mệt mỏi để nhập mô-đun và thực hiện các chức năng bằng tay đặc biệt là không tự động hoàn thành. Để giải quyết vấn đề này, tôi đã tạo một tập lệnh shell nhỏ "rancript.sh" cho phép bạn tận dụng tối đa tính năng tự động hoàn thành và lịch sử nhật ký của bảng điều khiển Linux.
NB: Sao chép tệp runcript.sh vào dự án gốc và đặt quyền thực thi (chmod + x)
Ví dụ: Tôi muốn chạy hàm python có tên show (a, b, c) trong mô-đun do_somethings.py trong myapp / do_folder /
Cách django tiêu chuẩn (quản lý shell):
python3 manage.py shell
> from myapp.do_folder import do_somethings
> do_somethings.show("p1", "p2" , 3.14159)
Với tập lệnh (rancript.sh):
./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159
Kịch bản không bị giới hạn về số lượng đối số. Tuy nhiên, chỉ các đối số của kiểu nguyên thủy được hỗ trợ (int, float, chuỗi)
runscript
từ django-extensions
gói làm tương tự, hãy kiểm tra nó django-extensions.readthedocs.io/en/latest/runscript.html
Đi dự tiệc muộn. Nhưng điều này có thể hữu ích cho một ai đó.
Tất cả bạn cần là kịch bản của bạn và django-extensions
cài đặt.
Chỉ cần chạy shell_plus
có sẵn django_extensions
và nhập tập lệnh mà bạn đã viết.
Nếu tập lệnh của bạn scpt.py
nằm trong thư mục, fol
bạn có thể chạy tập lệnh như sau.
python manage.py shell_plus
và chỉ cần nhập tập lệnh của bạn bên trong shell như sau.
>>> from fol import scpt
django.setup () dường như không hoạt động.
dường như cũng không được yêu cầu.
Điều này một mình làm việc.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
việc, bạn thực sự muốn làm gì?