strPythonでtarアーカイブにを追加するのに問題があります。Python 2では、次のような方法を使用しました。
fname = "archive_name"
params_src = "some arbitrarty string to be added to the archive"
params_sio = io.StringIO(params_src)
archive = tarfile.open(fname+".tgz", "w:gz")
tarinfo = tarfile.TarInfo(name="params")
tarinfo.size = len(params_src)
archive.addfile(tarinfo, params_sio)
これは基本的にここにあるものと同じです。それはうまくいきました。ただし、Python 3に移行すると、エラーが発生し、次のエラーが発生します。
File "./translate_report.py", line 67, in <module>
main()
File "./translate_report.py", line 48, in main
archive.addfile(tarinfo, params_sio)
File "/usr/lib/python3.2/tarfile.py", line 2111, in addfile
copyfileobj(fileobj, self.fileobj, tarinfo.size)
File "/usr/lib/python3.2/tarfile.py", line 276, in copyfileobj
dst.write(buf)
File "/usr/lib/python3.2/gzip.py", line 317, in write
self.crc = zlib.crc32(data, self.crc) & 0xffffffff
TypeError: 'str' does not support the buffer interface
str正直なところ、オブジェクトを構築するポイントにtarfileモジュールにフィードバックしないため、それがどこから来ているのか理解するのに苦労していStringIOます。StringIOと、バイトなどの意味がpython 2から3に少し変更されたことは知ってstrいますが、間違いはなく、このタスクを解決するためのより良いロジックを思い付くことができません。
StringIOアーカイブに追加したい文字列の周りにバッファメソッドを提供するために、オブジェクトを正確に作成します。それでも、一部の人strがそれを提供していないことに私は驚かされます。その上、チェックサムの計算に関与していると思われる行の周りに例外が発生します。
誰かが私が誤解していることを説明できますか、または少なくともstrファイルシステムに中間ファイルを作成せずにtarアーカイブに単純なものを追加する方法の例を挙げてください。