2

私がやりたいのは

 $echo $PATH | python --remain-interactive "x = raw_input().split(':')"
 >>>
 >>> print x
 ['/usr/local/bin', '/usr/bin', '/bin']

ipythonソリューションが最適だと思います。これが達成できない場合、他のさまざまなコマンドからの出力を処理したい状況に対するあなたの解決策は何でしょうか?私は必死になって以前にサブプロセスを使用してそれを実行しましたが、それは理想的ではありません。

更新:これは最終結果に近づいています:

 echo $PATH > /tmp/stdout.txt; ipython -i -c 'stdout = open("/tmp/stdout.txt").read()'

では、どうすればこれを形に曲げることができますか

 echo $PATH | pyout

pyout「私のすべての問題に対する魔法の解決策」はどこにありますか。パイプ出力を書き込んでからipythonを実行するシェルスクリプトである可能性があります。bpが言うのと同じ理由で、行われたすべてが失敗します。

4

3 に答える 3

2

IPythonではこれを行うことができます

x = !echo $$$$PATH

の二重脱出$は苦痛ですが

あなたは私が推測するこれを行うことができます

PATH="$PATH"
x = !echo $PATH
x[0].split(":")
于 2010-02-23T08:51:43.227 に答える
1

--remain-interactiveお探しのスイッチはです-i-cスイッチを使用して、実行するコマンド(。など)を指定することもできます__import__("sys").stdin.read().split(":")。だからあなたが試みることは:(文字列をエスケープすることを忘れないでください!)

echo $PATH | python -i -c x = __import__(\"sys\").stdin.read().split(\":\")

ただし、表示されるのはこれだけです。

>>>

では、なぜそれが機能しないのですか?あなたが配管しているので。sys.stdinPythonインタープリターは、引数を読み取っているのと同じコマンドをインタラクティブに読み取ろうとしています。echo実行が完了したため、がsys.stdin閉じられ、それ以上の入力は発生しません。

同じ理由で、次のようなものがあります。

echo $PATH > spam
python -i -c x = __import__(\"sys\").stdin.read().split(\":\") < spam

...失敗します。

私がすることは:

echo $PATH > spam.bar
python -i my_app.py spam.bar

結局のところ、open("spam.bar")ファイルオブジェクトは次のようになりますsys.stdin:)

于 2010-02-23T08:56:02.503 に答える
0

「それを行うための明白な方法は1つ、できれば1つだけでなければならない」というPythonの公理により、subprocessモジュール以外のプロセスと対話するためのより良い方法はないと合理的に確信しています。

次のようなものが「理想的ではない」理由を言うことができれば、それは役立つかもしれません。

>>> process = subprocess.Popen(['cmd', '/c', 'echo %PATH%'], stdout=subprocess.PIPE)
>>> print process.communicate()[0].split(';')

(あなたの特定の例では使用できますos.environが、それは実際にはあなたが求めているものではないことを私は理解しています。)

于 2010-02-23T08:50:03.403 に答える