Подпроцесс Python с двойными кавычками и пробелами для команды django

#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 из shlex

3. вы можете передать полную команду в виде строки, если используете 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,
)