-u
オプションを用いて stdout と stderr のバッファを行わないようにするPython内で新しい子プロセスを立ち上げる時に、Pythonの subprocess
モジュールを用いることで、子プロセスを良い感じに抽象化して扱うことができます。例えば以下のコードでは、Bashスクリプトを子プロセスで実行し、その子プロセスの標準出力を文字列として受け取っています。ここで注目して欲しいのは、asyncio
を用いて、標準出力をインタラクティブに受け取れることです。1秒ごとに、インクリメントされた数値が表示されます。
cmd = 'for i in `seq 1 5`; do echo $i; sleep 1; done'
proc = await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE)
async for data in proc.stdout:
line = data.decode('ascii').rstrip()
print(line)
ここで、BashではなくPythonの子プロセスを立ち上げて結果を受け取ってみようと考え、以下のコードを作成しました。
cmd = \
'python -c "' + \
'import time\n' + \
'for i in range(5): print(i); time.sleep(1)"'
proc = await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE)
async for data in proc.stdout:
line = data.decode('ascii').rstrip()
print(line)
いざこのプログラムを実行してみると、期待通りの結果が得られませんでした。最初に示したプログラムでは1秒毎に数値が表示されていましたが、上記プログラムを実行すると、最初5秒間は何も表示されず、5秒後に全ての結果が一気に表示されてしまいました。
色々試してみましたが、Pythonプログラムに変更を加えても、インタラクティブに結果を受け取ることはできませんでした。挙動を見る限り、どこかに文字列がバッファされているようだったので、もしや Python のランタイムが怪しいのではと思いググると、あっさり問題は解決しました。
PythonのCLIツールには、-u
オプションというものがあります。-u
オプションは、Pythonのランタイムに stdout と stderr のバッファをさせるかどうかを決めるオプションです。デフォルトでは、バッファをするようになっているため、このオプションをつけることでバッファをしないようにします。
-u
オプションを追記した以下のプログラムでは、期待通りにインタラクティブな結果を得ることができました。よかった。
cmd = \
'python -u -c "' + \
'import time\n' + \
'for i in range(5): print(i); time.sleep(1)"'
proc = await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE)
async for data in proc.stdout:
line = data.decode('ascii').rstrip()
print(line)
今回は表面的な調査しかしていませんが、また時間があれば Python ランタイムでどのようにバッファが行われているのか、調査してみたいです。
import asyncio
import sys
async def run():
cmd = \
'python -u -c "' + \
'import time\n' + \
'for i in range(5): print(i); time.sleep(1)"'
proc = await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE)
async for data in proc.stdout:
line = data.decode('ascii').rstrip()
print(line)
await proc.wait()
asyncio.run(run())
結論 coc-settings.json に以下の設定を追記します(ここでは clangd を例にしています)。これを追記することで、Language Server のログを全て出力するようにします。 { "clangd.arguments": ["--log", "verbose"], "clangd.trace.server": "verbose" } 次に、以下の Vim コマンドを入力します。
Mar 23, 2022自宅鯖で複数のサービスを運用している。Cloudflare の設定メモでも書いたが、自宅サーバのプロキシとして Cloudflare を利用し始めた。そのため、自宅サービスへの入り口を 80 番ポートに全てまとめてしまいたい。そこで、Envoy を front-proxy として利用しようと考えた。 参考にしたもの Envoy の公式ドキュメントを参考にした Front proxy -- envoy envoy/examples/front-proxy
Jan 3, 2022エストニアは北ヨーロッパに位置する、人口 130 万人程度の小国である。電子化を政府主導で進めていたり、企業に課せられる税金が安かったりと、何かと注目を浴びる国だ。そして、今回紹介する e-residency と呼ばれるサービスをエストニアは展開している。これがすごい。 e-residency とは読んで字の如く、エストニアの電子国民になることができるサービスである。電子国民とはなんぞやと思うかもしれないが、簡単に言うと、仮想的にエストニアの国民になることができるサービスである。以下のような恩恵を受けることができる。 エストニア政府のサービスを利用 レペゼンエストニア的な起業 エストニアの銀行口座の開設 エストニアの電子署名 通常、他国の visa を取ることは、社会的な信用性とか、収入とか、最終学歴などの項目が評価されるため、とても大変だ。しかし、エストニアの電子国民になれば、これらのフィルターを回避して、海外での起業(エストニアはいわゆるタックスヘイブンである)だったり、海外の銀行口座開設などという、通常できないような事が簡単にできるようになる。しかし、電子国民と言っても、国籍や visa を得られる訳ではないので、制限はあるが...。
Jan 3, 2022tl;dr hackmd の記事一覧 (GET https://api.hackmd.io/api/@account_name/overview) を取得する proxy server を Goalng で実装して、github.io 上に React で構築した ポートフォリオ から、hackmd 上の記事をいい感じに表示するようにした。実装はここ 感想 hackmd では下の図のように右上の publish ボタンを押すだけで簡単に記事を公開できる。普段 hackmd でばかりメモを取っているので、気軽に記事を公開できるようになりアウトプットが捗りそう。 hackmd の利用規約的に、この proxy の使い方が駄目なのかよく分からない。特に認証やトークン等を利用した制限はかかっていなかったので実装した。駄目っぽかったら教えてほしい。 現在は hackmd の free プランを利用しており、記事の git 管理や、画像の保存先を private cloud にするためには有料会員になる必要がある。検討してみる。
Jan 2, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up