2017-11-25 17 views
0

bash printf "\x00\x00\xFF\x00" | dd bs=4 seek=$(($y*$width+$x)) of=/dev/fb0の場合、はモニターのピクセル単位の幅で、xyの座標に赤いピクセルを書き込むことができます。16進数のPythonサブプロセス

私は画像の色の値を取得するためにpythonを使用しています。以前のbashコマンドを呼び出して、pythonで見つかった値を入れたいと思います。

私はサブプロセスを呼び出す場合:

command = 'printf "\x00\x00\xFF\x00" | dd bs=4 seek=276200 of=/dev/fb' 
subprocess.call(command, shell=True) 

私はこのエラーを取得する:\x文字サブプロセスの作品がなければ

Traceback (most recent call last): 
File "./sub.py", line 30, in <module> 
subprocess.call(command, shell=True) 
File "/usr/lib/python2.7/subprocess.py", line 522, in call 
return Popen(*popenargs, **kwargs).wait() 
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child 
raise child_exception 
TypeError: execv() arg 2 must contain only strings 

command = 'printf "test" | dd bs=4 seek=2 of=test.txt' 
subprocess.call(command, shell=True) 

私はこの1つのようないくつかの興味深いリンクが見つかりました:Formatting a command in python subprocess popen を私は実際にそれを得ることはありません。サブプロセスに\x文字を入れることは可能ですか?どうやって ?別の方法がありますか?

は非常に多くの

EDITありがとう:すべての

まずあなたの助けのすべてに感謝します。

私はトリックを行う何かを発見しました。私はこれが最良の方法だとは思わないが、それは機能する。

printf "\x00\x00\xFF\x00"は正常に動作し、奇妙な文字を出力します。しかし、Pythonサブプロセスsubprocess.call('printf "\x00\x00\xFF\x00"', shell=True)で呼び出されると、エラーTypeError: execv() arg 2 must contain only stringsが返されます。このようなバックスラッシュをエスケープすると、subprocess.call('printf "\\x00\\x00\\xFF\\x00"', shell=True)がで、奇妙なものではなくとなるので、端末からのprintfとまったく同じではありません。私は多くの異なる方法で逃げようとしましたが、私はを手に入れませんでした。なぜ私は正確に分からない。

だから私はこのような小さなprintf.bashファイル作っ:

#!/bin/bash 
printf $1 

をそして私はこのようなサブプロセスを呼んでいる:

subprocess.call('./printf.bash "\\x00\\x00\\xFF\\x00"', shell=True) 

と私は私が望むを取得します。不思議なことに、これはより異なります

subprocess.call('printf "\\x00\\x00\\xFF\\x00"', shell=True) 

+0

バイナリデータを含む文字列をコマンドライン引数としてシェルに渡す方法はありますか?存在する場合は、それを使用する 'command'文字列を作成します。 – martineau

+2

なぜサブプロセスを使用していますか?ファイルを開いてPythonから直接書き込むことができます。 'with open("/dev/fb "、" wb ")をfb:fb.seek(276200)とします。 fb.write( '\ x00 \ x00 \ xff \ x00') ' – chepner

+0

ありがとう、私は知らなかった、面白そうだ、私はこれをテストするつもりだ、' dd'オプション 'bs = 4'はどうだろうか? fb.seekで? – Lucien

答えて

3

は、バックスラッシュをエスケープしてみていただきありがとうございます。

command = 'printf "\\x00\\x00\\xFF\\x00" | dd bs=4 seek=276200 of=/dev/fb' 

編集:私はbashで、私が実際に表示される文字のためのあなたのprintfを変更するために必要な:

printf "\x000\x000\x0FF\x000" 

上記のI /余分なリードの数字を追加してみてくださいと思い、作業している場合ではないかもしれませんバックスラッシュをエスケープすることもできます。編集:またはPythonの生の文字列のフラグを示唆するコメントを参照してください。参照:py string literals

+0

はい。または、代わりに 'command = r'printf" \ x00 \ x00 \ xFF \ x00 "| dd bs = 4 seek = 276200 of = deleteme''。 – John1024