#python #django #subprocess
#python #django #подпроцесс
Вопрос:
Я использую этот плагин node для запуска команд управления django.
Если я выполняю команду напрямую, она работает:
sls wsgi manage local -c "check --list-tags"
Если я вызываю скрипт python, который вызывает его как подпроцесс, он не может найти команду:
import subprocess
proc = subprocess.Popen(['sls', 'wsgi', 'manage', 'local', '-c', '"check --list-tags"'])
(out, err) = proc.communicate()
"Traceback (most recent call last):n File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 102, in call_commandn app_name = get_commands()[command_name]nKeyError: 'check --list-tags'nnDuring handling of the above exception, another exception occurred:nnTraceback (most recent call last):n File "./wsgi_handl
er.py", line 89, in handlern management.call_command(*shlex.split(meta.get("data", "")))n File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 104, in call_commandn raise CommandError("Unknown command: %r" % command_name)ndjango.core.management.base.CommandError: Unknown command: 'check --list-tags'n
"
Если я выполняю команду, которая не содержит пробелов, она работает, например:
subprocess.Popen(['sls', 'wsgi', 'manage', 'local', '-c', '"makemigrations"'])
Комментарии:
1. вы пробовали proc = subprocess. Popen([‘sls’, ‘wsgi’, ‘manage’, ‘local’, ‘-c’, ‘»check’, ‘—list-tags»‘])
2. Это выдает
ValueError: No closing quotation
из shlex3. вы можете передать полную команду в виде строки, если используете shell = True, попробуйте это и доработайте позже proc = subprocess. Всплывающее окно (‘sls wsgi управляет локальным -c «check —list-tags»‘ shell= True, стандартный вывод=подпроцесс. КАНАЛ, stderr= подпроцесс. КАНАЛ)
4. Это помогло, спасибо!
5. опубликует ответ, и вы примете его затем
Ответ №1:
вы можете передать полную команду в виде строки, если используете shell = True, попробуйте это и доработайте позже
proc = subprocess.Popen(
'sls wsgi manage local -c "check --list-tags"',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)