LINUX.ORG.RU

Pipe, argparse, custom django-admin command. Где ошибка?

 , ,


0

1

Использую данный шаблон для написания собственной команды в django.

Здесь см. рейтинг 44 пишут, что словарь можно передать в виде строки формата json (с двойными кавычками), а json.loads() обратно преобразует его в словарь.

Если смотреть на шаблон, так понимаю, что для команды в django мне нужно только это из ответа?

parser.add_argument('-i', '--input', type=json.loads) 

У меня это выглядит так:

#populate.py
from django.core.management.base import BaseCommand, CommandError
from dineOUT.models import*
import json



class Command(BaseCommand):
    help = 'add objects to DB'


    def add_arguments(self, parser):
        parser.add_argument('dic', nargs='?', type=json.loads)
 


    def handle(self, *args, **options):
        dic=options['dic']

        for k, v in dic.items():

При запуске команды python create_dict.py | python manage.py populate, выдает ошибку

AttributeError: 'NoneType' object has no attribute 'items'   

Отдельно вот это работает

python create_dict.py 
в терминал печатается словарь. В create_dict.py словарь преобразуется
 print(json.dumps(d)) 



Последнее исправление: hibiscusM (всего исправлений: 1)

А как ты его запускаешь? Сделал так, умвр

parser.add_argument(
            '--meme',
            dest='meme',
            action='store',
            type=json.loads
        )
    def handle(self, *args, **options):
        print options['meme']

./manage.py test_command --meme='{"a":1}'
pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts
python create_dict.py | python manage.py populate 

Эта команда не ошибочна? Пытаюсь добиться, чтобы результат выполнения create_dict.py (печатается в терминал) направлялся в populate.py.

Так тоже не работает, та же самая ошибка, т.е. dic имеет значение None.

#populate.py
from django.core.management.base import BaseCommand, CommandError
from steakOUT.models import*
import json



class Command(BaseCommand):
    help = 'add objects to DB'


    def add_arguments(self, parser):
        parser.add_argument('--dic', dest='dic', action='store', type=json.loads)
 


    def handle(self, *args, **options):
        dic=options['dic']

        for k, v in dic.items():

hibiscusM
() автор топика
Ответ на: комментарий от hibiscusM

Ошибочна, конечно. Тебе надо либо из sys.stdin читать, чтобы она так работала. Либо man xargs

pawnhearts ★★★★★
()
Ответ на: комментарий от pawnhearts

у меня даже такой варикнт не работает, как у тебя и когда я пишу

python manage.py populate --dic='{"1",1}' 

Выдает ошибку

manage.py populate: error: argument --dic: invalid loads value: '{"1",1}' 

что это такое «invalid loads value»? почему это появляется, когда у меня все в точности, как у тебя в populate.py?

hibiscusM
() автор топика
Ответ на: комментарий от pawnhearts

это по невнимательности, спасибо!

У меня с sys.stdin и xargs тоже ошибки. Можно твой пример с sys.stdin и с xrags ?

hibiscusM
() автор топика
Ответ на: комментарий от hibiscusM

Вместо argparse просто делаешь dic=json.load(sys.stdin)

cat json| xargs -0 -I {} python manage.py blabla --dic='{}'

Только это так себе вариант, потому что может что-то сломаться из-за экранирования. Лучше передавать путь к файлу через аргументы вообще, на крайняк /dev/stdin туда передашь или типа того.

pawnhearts ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.