2016-11-05 4 views
0

Я пытаюсь выполнить версию Mac, которая отлично работает под Windows, используя python 2.7. В Mac (OS X El Capitan, работающем в VirtualBox), он терпит неудачу, потому что аргументы, которые я передаю в оболочку, не распознаются должным образом.Ошибка аргументов подпроцесса Python 2 под Mac

Оригинальный код:

for item in source_files: 

    # core process 
    output = sub.Popen(["mhl", "verify", "-vv", "-f", item, ">", text_report], 
         shell=True, 
         stdout=sub.PIPE, 
         stderr=sub.PIPE) 
    stdout_value, stderr_value = output.communicate() 

Под Mac только аргумент 'MHL' признается, поэтому я попытался это:

sub.Popen(['mhl verify -vv -f', item, '>', text_report] 

Сейчас команда работает, но элемент (.mhl файл) не признается, поэтому я попытался это:

sub.Popen(['mhl verify -vv -f', '/Users/simon/Documents/Documents.mhl', '>', text_report] 

и это:

sub.Popen(['mhl verify -vv -f', r'/Users/simon/Documents/Documents.mhl', '>', text_report] 

Те же результаты, он сообщает мне, что файл mhl должен следовать аргументу '-f'. Если я добавлю элемент непосредственно к первому аргументу, он отлично работает:

sub.Popen(['mhl verify -vv -f /Users/simon/Documents/Documents.mhl', '>', text_report] 

Что мне здесь не хватает?

ответ

1

Вы запрашиваете ОС для запуска исполняемого файла 'mhl verify -vv -f', и такого исполняемого файла нет. На пространствах не происходит расщепления раковины.

С shell=True вы хотите передать все, как одна строка, а не как отдельные аргументы:

sub.Popen('mhl verify -vv -f {} > {}'.format(item, text_report), 
      shell=True, stdout=sub.PIPE, stderr=sub.PIPE) 

Обратите внимание, что есть мало смысла в управлении stdout к трубе здесь, поскольку все выходные стандартный вывод из команды mhl перенаправляется в файл.

Если вы хотите захватить вывод команды mhl непосредственно в Python, я бы не использовал посредника оболочки; работать без shell=True, а затем просто использовать subprocess.check_output() для получения выходного сигнала:

output = sub.check_output(['mhl', 'verify', '-vv', '-f', item]) 

Обратите внимание, что теперь название программы и аргументы должны быть переданы в готовом расщепленном на отдельные строки.

+0

Спасибо за ваш ответ, но он не работает, так как с исходным кодом признается только аргумент «mhl», он сообщает мне «недопустимое количество аргументов». Фактически 'mhl verify -vv -f' распознается должным образом в качестве вызова исполняемого файла mhl с аргументами 'verify -vv -f', но он сообщает мне, что файл mhl должен следовать за аргументом '-f'. –

+0

@SimonTheChain: вы также передаете 'item','> 'и' text_report'. –

+0

@SimonTheChain: обновлено; Я пропустил, что у вас есть набор «shell = True». У вас все еще есть команда 'mhl verify -vv -f item', выполняемая здесь. –

Смежные вопросы