2013-10-26 5 views
1

бит сценария здесь, и для непосредственного тестирования вам понадобится wkhtmltopdf (в этом случае прослушивание порта 7000 w/--read-args-from-stdin) и запуск в качестве демона (и удобный html-файл на руке)Почему функция subprocess.call() не работает, как ожидалось?

если я:.

echo "-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my.pdf" | nc localhost 7000 

затем очень быстро из эстрадного /tmp/my.pdf ... Я могу сделать это 25 раз подряд и получить столько результатов, как если бы я spun wkhtmltopdf вверх и вниз 25 раз отдельно.

Walp, это означает, что мне нужно иметь возможность вызвать ЭТО из нашего собственного демонстратора очереди, и, кроме того, я должен дождаться его завершения, прежде чем проверять наличие результатов и тиканье успехов или сбоев соответственно ,

Я нашел subprocess.call, но это не работает по причинам, неуказанным ... а именно, из питона строки:

call(['echo', '\"-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my1.pdf\"', '|', 'nc', 'localhost', '7000']) 

я получаю:

"-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf" | nc localhost 7000 
0 

0 предположить, что он думает, это было успешно ... но, в отличие от того, когда я делаю то же самое заявление из самого bash, ничего не выходит из демона wkhtmltopdf. Я пытался приклеить дополнительное «эхо» там, так как распечатка не включает его, но тот же результат.

Итак ... так или иначе, это не связано с тем, что делается при вводе непосредственно в подсказку bash.

Идеи? Экспертиза?

Спасибо!

+4

Трубы обрабатываются оболочкой, которую 'subprocess.call' не использует по умолчанию. Используйте 'subprocess.call ('command | stuff', shell = True)'. – Blender

+0

ooooooh; Большое спасибо –

ответ

1

Чтобы решить вашу проблему, вызов echo и nc через оболочку является жизнеспособным, но непрактичным путем.

Вместо этого я бы

def call_7000(*a): 
    import socket 
    s = socket.create_connection(('localhost', 7000)) 
    s.write(" ".join(str(i) for i in a) 
    s.close() 

, который теперь можно назвать в качестве

call_7000("-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf") 

или

(за исключением я не знаю, если «~/my.html «работает, может быть, вы должны сделать os.expanduser('~/my.html').)

Вы могли бы даже сделать

def call_7000(*args, **kwargs): 
    import socket 
    import itertools 
    s = socket.create_connection(('localhost', 7000)) 
    items = itertools.chain(" ".join("-%s %s" % (k, v) for k, v in kwargs), a) 
    s.write(" ".join(str(i) for i in items) 
    s.close() 

и назвать его

call_7000("/tmp/my1.pdf", s="letter", T="24mm", R="24mm", B="0mm", g="~/my.html") 

если упорядочение вариантов не является актуальным.

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