Если fromDict.py
печатает на терминал (STDOUT), вы можете использовать pipe (|
) для получения параметра из STDIN в вашей команде управления, вы можете использоватьsys.stdin
за это.Поскольку вы, возможно, захотите выполнить команду самостоятельно, рекомендуется также принимать строку по параметру.
Ваша команда управления будет выглядеть так:
# populate_db.py
import argparse
import ast
import sys
from django.core.management.base import BaseCommand, CommandError
class Command(BaseCommand):
help = 'Polulate the Database'
def add_arguments(self, parser):
parser.add_argument(
'input_dict',
nargs='?',
type=str,
default=None
)
def handle(self, *args, **options):
if options['input_dict']:
input_dict = options['input_dict']
else:
input_dict = sys.stdin.read()
try:
data = ast.literal_eval(input_dict)
except SyntaxError:
raise CommandError(f'Invalid dict input: {input_dict}')
# populate the DB with data
Вы можете выполнить этокоманда с:
Получение диктата из STDIN
python fromDict.py | python yourproject/manage.py populate_db
или
Передача дикта по параметру
python yourproject/manage.py populate_db '{'some': 'dict'}'
Примечание: Будьте осторожны с literal_eval если dict исходит из ненадежного источника, так как кто-то может использовать его (например, с очень большими значениями), чтобы сломать интерпретатор python.