2015-05-27 4 views
0

Использование Python 2.7 на Raspberry Pi B +, я хочу, чтобы вызвать команду «raspistill -o image.jpg» из Python и найти с помощью этого рекомендуется:Python subprocess.call() не записывает содержимое в файл

from subprocress import call 
call(["raspistill","-o image.jpg"]) 

Однако, это не работает, так как image.jpg не создается, хотя за пределами Python,

raspistill -o 

действительно создает файл. Следующая попытка сначала создать файл изображения и записать его.

f = open("image.jpg","w") 
call(["raspistill","-o image.jpg"], stdout = f) 

Теперь файл изображения создается, но ничего не написано на нем: его размер остается 0. Так как я могу получить эту работу?

спасибо.

ответ

2

Вы передаете -o image.jpg в качестве единственного аргумента. Вы должны передать их, как два. Вот как:

call(["raspistill", "-o", "image.jpg"]) 

, как вы это сделали, это как вызов raspistill "-o image.jpg" из командной строки, которая, скорее всего, приведет к ошибке.

+0

Благодарим за отзыв. Однако без f = open ("image.jpg", "w") с этим изменением файл по-прежнему не создается. Любые предложения приветствуются. – user2294285

+0

@ user2294285: см. Ответ @ abarnert.Имея оба средства, у вас есть две программы (python и raspistill), пытающиеся писать в один и тот же файл одновременно - в лучшем случае беспорядок. По крайней мере, вы должны называть 'f.close()' * до * вы запускаете raspistill. – cdarke

+1

@ user2294285 Я предлагаю вам попробовать 'subprocess.check_output ([" raspl ... "])'. Если файл не создан, возможно, есть ошибка. Вышеприведенная команда должна распечатать ошибку. Пожалуйста, разместите здесь ошибку, и я постараюсь продолжить вас. –

2

Во-первых, вы создаете и усечения файл image.jpg:

f = open("image.jpg","w") 

Тогда вы отправляете raspistill «S стандартный вывод в том же файле:

call(["raspistill","-o image.jpg"], stdout = f) 

Когда вы в конечном итоге получить вокруг close -в файле в Python, теперь image.jpg просто собирается держать все, что raspistill написал в stdout. Или, если вы никогда не будете close, это будет тот минус последний буфер, который может быть вообще ничего.

Между прочим, вы также пытаетесь получить raspistill, чтобы создать файл с таким же именем, передав его как часть аргумента -o. Вы делаете это неправильно, как объясняет Ionut Hulub's answer. Некоторые программы будут принимать "-o image.jpg""-oimage.jpg" и "-o", "image.jpg" как значение одно и то же, некоторые не будут. Но, даже если это делает, в лучшем случае у вас есть две программы, борющиеся за то, что файл создается и написан как image.jpg.

Если raspistill имеет возможность написать все еще на стандартный вывод, то вы можете использовать что вариант, вместе с прохождением stdout=f, и убедившись, что close файл. Или, если у него есть возможность записать имя файла, вы можете использовать , что вариант. Но делать и не собирается работать.

+0

Спасибо за ваш ответ, хотя я нахожу это запутанным. 'f = open (" image.jpg ")' не создает файл. Конечно, я закрываю файл после вызова. Я пробовал с вашими предложениями и использовал «raspistill», «o», «image.jpg», но до сих пор нет улучшения. – user2294285

+0

@ user2294285: Да, 'f = open (" image.jpg "," w ")' создает файл. Если файл с таким именем уже существует, в этом случае он открывает и обрезает этот файл. Это именно то, для чего. – abarnert

1

Если вы не знаете, как разделить эту команду, вы можете использовать shlex.split. Например,

>>> import shlex 
>>> args = shlex.split('raspistill -o image.jpg') 
>>> args 
['raspistill', '-o', 'image.jpg'] 
>>> call(args)