Django kabuğundan bir Python betiği yürütmem gerekiyor. Denedim:
./manage.py shell << my_script.py
Ama işe yaramadı. Sadece bir şeyler yazmamı bekliyordu.
Django kabuğundan bir Python betiği yürütmem gerekiyor. Denedim:
./manage.py shell << my_script.py
Ama işe yaramadı. Sadece bir şeyler yazmamı bekliyordu.
Yanıtlar:
<<
Bölüm yanlış, kullanmak <
yerine:
$ ./manage.py shell < myscript.py
Ayrıca şunları da yapabilirsiniz:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Python3 için kullanmanız gerekir
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
. Bunun, bir manage.py
komut oluşturmanın hantal sürecinden geçmek zorunda kalmadan, yalnızca bir kez çalıştırmanız gereken hızlı ve kirli komut dosyaları için yararlı olabileceğini gördüm .
Get-Content myscript.py | .\manage.py shell
Sen o yapılması tavsiye değiliz shell
- ve gerçekten Django ortamından rastgele komut dosyalarını yürütme edilmelidir olarak bu tasarlanmıştır (ama orada vardır , diğer yanıtları görmek Bu etrafında yolu).
Bu birden fazla kez şekilde çalışacaktır bir senaryo ise, bu iyi bir fikir bir şekilde kurmak için var özel komut yani
$ ./manage.py my_command
Bunu yapmanın bir alt dizinindeki bir dosya oluşturun management
ve commands
senin içinde app
, yani
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
ve bu dosyada özel komutunuzu tanımlayın (dosya adının yürütmek istediğiniz komutun adı olduğundan emin olun ./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
kullanımdan kaldırıldığı için. Bu sayfa çalışan bir örnek veriyor: docs.djangoproject.com/tr/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
gerekiyordu def handle(self, **options):
.
def handle(self, **options):
James'in yorumu olarak değiştirin .
Django 1.7+ kullanan herkes için, sadece ayarlar modülünü içe aktarmak yeterli değildir.
Biraz kazdıktan sonra, bu Yığın Taşması cevabını buldum: https://stackoverflow.com/a/23241093
Şimdi yapmanız gerekenler:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Yukarıdakileri yapmadan bir django.core.exceptions.AppRegistryNoReady
hata alıyordum .
Betik dosyam, django projemle aynı dizinde (yani, manage.py ile aynı klasörde)
DJANGO_SETTINGS_MODULE
ortam değişkeninde zaten başvurulan ayarlar dosyası var . Bununla sadece import django ; django.setup()
1.7'nin altında yeterliydi .
django.setup()
komut dosyası erişim Django modellerini izin vermez, hatta onları içe!
import django; django.setup()
.
Partiye geç kaldım ama umarım cevabım birisine yardım eder: Bunu Python betiğinizde yapabilirsiniz:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
geri kalan şeyler buraya gider ....
sys.path.append
Alacağınız uzun olduğunca şeyler DJANGO_SETTINGS_MODULES
(sadece yapabileceğiniz sitenizin kökü yukarıda oturan bir komut dosyası varsa mesela sağa os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
sys.path.append(os.getcwd())
benim proje dizin içinde olduğum zaman çalışır, benim DJANGO_SETTINGS_MODULE doğru olduğunu ve bunu ithalat modelleri, görünümler, vb bir komut dosyası çalıştırmayı deneyin
runscript
dan django-uzantılarına
python manage.py runscript scripty.py
script.py
Test etmek için bir örnek :
from django.contrib.auth.models import User
print(User.objects.values())
Http://django-extensions.readthedocs.io/en/latest/command_extensions.html adresinde bahsedildi ve şu adreste belgelendi:
python manage.py runscript --help
Django 1.9.6, django uzantıları 1.6.7'de test edilmiştir.
django-extensions
(yapmanız gerekir). Not: runscript
Standart django kullanıyor gibi görünüyor shell
. shell_plus
Basit uzantılar için her şeyi içe aktarmanız gerekmediği için (uzantılarda da) harika olurdu .
IPython varsa ( pip install ipython
) ./manage.py shell
, otomatik olarak kabuğunu kullanır ve magic komutunu kullanabilirsiniz %run
:
%run my_script.py
runscript
proje / paket dışındaki komut dosyalarıyla çalıştığı ve böyle şikayet etmediği avantajına sahiptirTypeError: the 'package' argument is required to perform a relative import for
Betiği sadece DJANGO_SETTINGS_MODULE
ortam değişkeni kümesiyle çalıştırabilirsiniz. Django-shell ortamını kurmak için gereken tek şey bu.
Bu Django'da çalışır> = 1.4
@AtulVarma, çalışmayan kabul edilen cevap altında çok yararlı bir yorum yaptı :
echo 'import myscript' | python manage.py shell
betiğinizde çok fazla komut yoksa bunu kullanın:
manage.py shell --command="import django; print(django.__version__)"
Diğer yanıtların belirttiği ancak açıkça belirtmediği gibi, aslında ihtiyacınız olabilecek şey komut dosyanızı Django kabuğundan yürütmek değil, Django kabuğunu kullanmadan uygulamalarınıza erişmek .
Bu çok Django sürümünü Django sürümüne göre değişir. Çözümünüzü bu iş parçacığında bulamazsanız, burada yanıtlar - manage.py shell kullanmadan model nesnelere erişmek için Django komut dosyası - veya benzer aramalar size yardımcı olabilir.
My_command.py ile başlamak zorunda kaldım
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
ve sonra koştu python3 my_command.py
(Django 2.0.2)
sys.path.append('/path/to/myproject')
ile BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ve 'sys.path.append (BASE_DIR) `. Komutu çalıştırmadan önce sanal ortamınızı etkinleştirmeyi de unutmayın!
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
Bu yöntemin django! Nun daha yeni sürümleri için kullanımdan kaldırıldığını unutmayın. (> 1.3)
Alternatif bir cevap olarak, bunu my_script.py
from django.core.management import setup_environ
import settings
setup_environ(settings)
ve my_script.py
sadece sahip olduğunuz dizinde python ile çalıştırın settings.py
ama bu biraz hileli.
$ python my_script.py
Sadece ilginç bulduğum bir şey, python manage.py runscript foobar ile çalıştırılacak betikler yazmanıza izin veren Django Scripts. Uygulama ve yapı hakkında daha ayrıntılı bilgiye http://django-extensions.readthedocs.org/en/latest/index.html adresinden ulaşabilirsiniz.
Sanal ortam kullanıyorsanız bunu deneyin: -
python manage.py kabuk
bu komutu kullanmak için sanal ortamın içinde olmalısınız. bu kullanım için: -
workon Instagram Hesabındaki Resim ve Videoları vir_env_name
Örneğin :-
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)
>>>
Not : - Burada sitem benim web sitemin adı ve jango benim sanal çevre adım
Aksi takdirde bunu yürütmek:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
Bu Python2.7 ve Django1.9 üzerinde çalışıyor
Django kabuğu, django ortamıyla bir python modülü yürütmenin iyi bir yoludur, ancak özellikle otomatik tamamlama olmadan modülleri almak ve işlevleri manuel olarak yürütmek her zaman kolay ve yorucu değildir. Bu sorunu çözmek için , Linux konsolu otomatik tamamlama ve günlük geçmişinden tam olarak yararlanmanızı sağlayan küçük bir kabuk komut dosyası "runscript.sh" oluşturdum.
Not: runscript.sh dosyasını kök projeye kopyalayın ve yürütme hakkını ayarlayın (chmod + x)
Örneğin: myapp / do_folder / içindeki do_somethings.py modülünde show (a, b, c) adlı python işlevini çalıştırmak istiyorum
Standart django yolu (manage.py shell):
python3 manage.py shell
> from myapp.do_folder import do_somethings
> do_somethings.show("p1", "p2" , 3.14159)
Komut dosyasıyla (runscript.sh):
./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159
Komut dosyası, bağımsız değişken sayısı ile sınırlı değildir. Ancak yalnızca ilkel tür argümanları desteklenir (int, float, string)
runscript
gelen django-extensions
paketin, aynı kontrol edebilirim django-extensions.readthedocs.io/en/latest/runscript.html
Partiye geç. Ancak bu birisi için yararlı olabilir.
Tek ihtiyacınız olan komut dosyanız ve django-extensions
yüklü.
Sadece koşmak shell_plus
mevcut in django_extensions
ve yazdığınız o senaryoyu içe.
Betiğiniz varsa scpt.py
ve bir klasörün içindeyse fol
betiği aşağıdaki gibi çalıştırabilirsiniz.
python manage.py shell_plus
ve betiğinizi kabuğun içine aşağıdaki gibi aktarmanız yeterlidir.
>>> from fol import scpt
django.setup () çalışmıyor.
gerekli de görünmüyor.
bu yalnız işe yaradı.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
çalışır, aslında ne yapmak istiyorsunuz?