私はGphoto2を使ってDSLRで写真を撮影しています。 bashコマンドに基づいて私はsubprocess.communicate
を使用しようとしましたが、カメラが写真を撮った後にフリーズします。出力を読むときにPythonのサブプロセスがフリーズする
端末でgphoto2 --capture-image-and-download
を試してみると、2秒以下で完了します。私はラズベリーパイに取り組んでいます。
コード:
import subprocess
class Wrapper(object):
def __init__(self, subprocess):
self._subprocess = subprocess
def call(self,cmd):
p = self._subprocess.Popen(cmd, shell=True, stdout=self._subprocess.PIPE, stderr=self._subprocess.PIPE)
out, err = p.communicate()
return p.returncode, out.rstrip(), err.rstrip()
class Gphoto(Wrapper):
def __init__(self, subprocess):
Wrapper.__init__(self,subprocess)
self._CMD = 'gphoto2'
def captureImageAndDownload(self):
code, out, err = self.call(self._CMD + " --capture-image-and-download")
if code != 0:
raise Exception(err)
filename = None
for line in out.split('\n'):
if line.startswith('Saving file as '):
filename = line.split('Saving file as ')[1]
return filename
def main():
camera = Gphoto(subprocess)
filename = camera.captureImageAndDownload()
print(filname)
if __name__ == "__main__":
main()
私はこの取得終了した場合:
Traceback (most recent call last):
File "test.py", line 39, in <module>
main()
File "test.py", line 35, in main
filename = camera.captureImageAndDownload()
File "test.py", line 22, in captureImageAndDownload
code, out, err = self.call(self._CMD + " --capture-image-and-download")
File "test.py", line 11, in call
out, err = p.communicate()
File "/usr/lib/python2.7/subprocess.py", line 799, in communicate
return self._communicate(input)
File "/usr/lib/python2.7/subprocess.py", line 1409, in _communicate
stdout, stderr = self._communicate_with_poll(input)
File "/usr/lib/python2.7/subprocess.py", line 1463, in _communicate_with_poll
ready = poller.poll()
KeyboardInterrupt
任意のアイデア?
引用は「最後まで、stdoutとstderrからデータを読みます-of-fileに達しました。 - プロセスが終了していなければ、入力待ちの状態になります。あなたのプロセスは完了していますか? – Torxed
私はかなり確信しています。カメラのシャッターが聞こえ、ファイルが生成されます。一度私はそれが少なくとも5分間座っても、まだフリーズ...私はターミナルでプロセスをテストし、それ以上の入力なしで動作します。 – Dennis
これに似たものを試してみてください。https://gist.github.com/anonymous/0811f71ca0b290f2625c9ba768bd45fd – Torxed