0

bash シェルの周りに薄いラッパーを作成する python スクリプトがあります。subprocess モジュールを介して bash 呼び出しをラップし、出力を受け取り、それに何らかの作業を行います。

私の出力には改行 "\n" が含まれていますが、追加の色やスペースの書式設定 (つまりタブ) は含まれていません。

Ipython 内では、"ls" などのシェル組み込み関数を直接実行できます。出力は、bash シェルから「ls」コマンドを直接実行した場合の出力とほぼ同じように (色とスペースを使用して) フォーマットされます。

Ipython がシェル出力のフォーマットをどのように模倣するか考えていますか? それらは特別なケーシングの異なるコマンドですか?

Ipython に慣れていない場合は、さまざまなコマンドの明示的なマッピングとロジックを作成することなく、Python スクリプトの REPL で bash フォーマットを再作成する方法について何か考えはありますか?

ありがとう

4

1 に答える 1

1

ここで間違っている可能性がありますが、ipython はここで何もしないと思います。

と入力する!lsと、これはls. 私のシステムでは、ファイルにリダイレクトlsしてからcatそのファイルに対して . 私のbashシェルでにlsエイリアスされていても、それを無視します。ls -FG!ls

したがって、凝った書式設定が得られる場合は、凝ったことを行うようlsに (たとえば、env 変数を介して) 構成したためです。

ただし、ipython とコードで異なる点が 1 つあります。ipython はサブプロセスを標準出力に出力させているだけだと思います。ただし、その標準出力をキャプチャして、手動で独自の出力にルーティングしています。これは、bash とそのすべての子プロセスが、stdout が TTY ではないことを認識でき、それに応じて出力を変更できることを意味します。

したがって、bash の stdout をパイプにリダイレクトするだけではなく、それをptyにリダイレクトするか、TTY のように動作する別のものにリダイレクトする必要があります。

于 2013-05-16T21:32:17.667 に答える