2012-05-04 2 views
0

У меня возникла проблема с перенастройкой строк и python с командной строкой Ghostscript.Python - модуль подпроцесса - Ghostscript-2> & 1

Существует NP выполнения этого:

subprocess.call(["gs", "-q","-dBATCH", "-dNOPAUSE","-sDEVICE=bbox", "input.pdf"]) 

Но я получаю сообщение об ошибке при добавлении 2> & 1:

subprocess.call(["gs", "-q","-dBATCH", "-dNOPAUSE","-sDEVICE=bbox", "input.pdf","2>&1"]) 

Или:

subprocess.call(["gs", "-q","-dBATCH", "-dNOPAUSE","-sDEVICE=bbox", "input.pdf","2>&1",">/dev/null"]) 

Я хочу использовать 2> & 1 применить «grep».

Пример ошибки:

Error: /undefinedfilename in (2>&1) Operand stack:

Execution stack: %interp_exit .runexec2 --nostringval--
--nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push Dictionary stack: --dict:1156/1684(ro)(G)--
--dict:1/20(G)-- --dict:77/200(L)-- Current allocation mode is local Last OS error: 2 GPL Ghostscript 9.05: Unrecoverable error, exit code 1 1

до сих пор остается нерешенной, как выполнить команду, как:

subprocess.call("gs -q -dBATCH -dNOPAUSE -sDEVICE=bbox input.pdf 2>&1 
| egrep -v HiResBoundingBox | egrep -o "[0-9]{1,}",shell=True) 
+0

Команда "нераскрытым" вы пытаетесь выполнить не работает? Или это не работает, если вы попытаетесь сделать это с помощью 'shell = False'? (мне кажется, что он должен работать с 'shell = True') – mgilson

+0

В вашей первоначальной версии была опечатка: у нее было« 2 <& 1 », где« 2> и 1 »должно было быть (в двух разных местах). Убедитесь, что это было причиной ошибки, которую вы видели. В противном случае это может быть Python (с которым я не слишком знаком), не поддерживающий этот вид перенаправления (или требующий другого синтаксиса). –

+0

Читайте о «Взаимодействии с трубами» Ghostscript здесь: http://git.ghostscript.com/?p=ghostpdl.git;a=blob_plain;f=gs/doc/Use.htm;hb=HEAD#Pipes - Это может помочь вам найти обходной путь. –

ответ

1

Это потому, что вы передаете аргументы в виде списка. Когда вы передаете аргументы как итерабельные, каждая часть передается в порожденный процесс (в этом случае gs жалуется, что не знает, что делать с 2>&1 ...) Вероятно, вы получите то же сообщение, если вы Напечатано:

gs -q -dBATCH -dNOPAUSE -sDEVICE=bbox input.pdf '2>&1' 

в оболочке.

subprocess.call("gs -q -dBATCH -dNOPAUSE -sDEVICE=bbox input.pdf 2>&1",shell=True) 

будет делать то, что вы хотите - или 'лучше' ...

(лучше, потому что он обходит вопросы безопасности с shell=True)

+0

Спасибо. Я также хотел бы использовать 'subprocess.Popen', но в соответствии с этим [ответом] (http://stackoverflow.com/a/2502883/1341526) следует использовать список. – jacktrades

+0

@jacktrades 'subprocess.call' на самом деле просто тонкая оболочка вокруг' subprocess.Popen'. Списки обычно должны использоваться, потому что они избегают неуверенности 'shell = True', но тогда вам нужно избегать общих оболочечных конструкций, которые все мы любим (например, перенаправления). - Что касается ссылки, которую вы опубликовали, 'Popen' может вызывать оболочку, если вы передаете ее' shell = True', она просто не по умолчанию (то же самое с 'call') – mgilson

+0

Спасибо. Ваше «лучшее» предложение не полезно, так как последняя команда, которую я хочу использовать, включает «grep», а без 2 <& 1 grep не работает. 'gs -q -dBATCH -dNOPAUSE -sDEVICE = bbox input.pdf 2> & 1>/dev/null | egrep -v HiResBoundingBox | egrep -o "[0-9] {1,}" ' – jacktrades