Python io.BytesIO binary stream as {out,err}_stream container
まだ誰も着手していません。
評価
調査の方向性
Start with invoke/runners.py, especially handle_stdout and write_our_output, and the run wrapper in invoke/util.py. Determine how out_stream and err_stream handle binary file-like objects in synchronous and asynchronous execution; done means BytesIO receives real-time output without the reported TypeError or requiring filesystem storage.
索引モデルが issue の本文から書いたものです。
説明
Hi,
I'm trying to capture and process in real time the output of a command started with run in asynchronous mode, with the out_stream option using an in-memory buffer. So I've used the built-in io library with BytesIO class: is this class supported in your Invoke implementation?
I post the following code example:
import io
import time
from invoke import run
out = io.BytesIO()
run('ls -la && sleep 2 && ls -la', warn=True, pty=True, out_stream=out, asynchronous=True)
time.sleep(1)
while True:
myline=out.readline()
print(myline)
time.sleep(1)
if not myline:
out.close()
break
If you run this code, as you can see, it won't print any binary data despite readline() method is supported by BytesIO class. It seems run method is not writing in the out binary (buffer) object. Furthermore if you put asynchronous to False the script exits with this error:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/dist-packages/invoke/util.py", line 237, in run
super(ExceptionHandlingThread, self).run()
File "/usr/lib/python3.9/threading.py", line 892, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python3.9/dist-packages/invoke/runners.py", line 756, in handle_stdout
self._handle_output(
File "/usr/local/lib/python3.9/dist-packages/invoke/runners.py", line 730, in _handle_output
self.write_our_output(stream=output, string=data)
File "/usr/local/lib/python3.9/dist-packages/invoke/runners.py", line 718, in write_our_output
stream.write(encode_output(string, self.encoding))
TypeError: a bytes-like object is required, not 'str'
AFAIK io.BytesIO() is not a 'str' object, it's a binary stream using an in-memory bytes buffer.
Is it possible to use a BytesIO type (for binary data) as a buffer container of {out,err}_stream? If not, is it possible to implement it in Invoke, in order to process the output stream in real time (not when the command, that is very long in my project, has finished) without using filesystem (file-like) objects?
Thank you in advance for your help!
Roberto
- 主要言語
- Python
- スター
- 4.8k
- フォーク
- 412
- PR マージ指標
- 30日以内にマージされた PR はありません
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
pyinvoke/invoke のほかの issue
-
[Security] Shell injection via Context.cd() path argument — metacharacters not escaped (CWE-78) オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 64/100
pyinvoke/invoke の issue をすべて見る
似ている issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
stephrobert/dsoxlab#238 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
sublimehq/package_control#1780 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
nwg-piotr/nwg-displays#145 ·