電子書籍の厳選無料作品が豊富!

今日はLinux上でのコマンドライン、例えば以下のようなもの

$ head -n 20 test |grep '2011'|wc -l
5

を直接ターミナルに打ち込むのでなく、pythonに記入し、そのpythonファイルを叩くことで実行したいと思っております。
つまり、

head -n 20 test |grep '2011'|wc -l

というのをtest.pyみたいなものに保存し、
$pyothon test.py
と打ち込むと先ほどと同じ結果の「5」が返されるようにしたいです。
どのようにすればいいのでしょうか。よろしくお願いします。

A 回答 (2件)

> <open file '<fdopen>', mode 'rb' at 0x2b1268d74780>



エラーではありません。end_of_pipe(=wc.stdout)のオブジェクトの情報が表示されたものです。

http://www.python.jp/doc/release/library/subproc …
> Popen.stdout
> stdout 引数が PIPE の場合、この属性には子プロセスの出力に使われるファイルオブジェクトになります。そうでない場合は None です。

とあるように、wc.stdoutはファイルオブジェクトです。「実行結果を文字列にしたもの」ではありません。
文字列を取りだすなら、 readline等で、ファイルオブジェクトから文字列を読み出す必要があります。

number=end_of_pipe.readline()
print number

http://www.python.jp/doc/release/library/stdtype …
    • good
    • 0
この回答へのお礼

できました!
ありがとうございます。

分からないことがあったら公式から調べるのがいいとよく聞くのですが、いまいち調べ方が分かりませんでした。こうやって調べていくのですね。

ずっと悩んで困っていたので本当に助かりました。ありがとうございます!!

お礼日時:2012/10/08 11:11

どのような方法がお望みでしょう?



・Linuxのコマンド「head -n 20 test |grep '2011'|wc -l」 を実行したい
→ os.systemや subrprocessモジュールを使う。例えば。
import os
os.system("head -n 20 test |grep '2011'|wc -l")
けど、これならPythonでなくてもシェルスクリプトで可能。

・「先頭20行の '2011'が含まれる行を数え、出力する」ということがしたい
→ そのままの処理をPythonで書いてください。
基本操作ばかりなはずです。
ファイルのopenの方法がわからない、とか、含まれてるかどうか調べる方法がわからない、ということなら、まずは参考書とかマニュアルで関係しそうなところだけでも調べましょう。それでわかるはずです。

・それ以外
→ もっと詳しくやりたいことを書いてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
やりたいことは1990から2011のワードをカウントして出力するというものです。
コマンドラインで出来る操作なので、それをプログラミングに書けば簡単に出きると思ったのですが、それってつまりプログラミングでも簡単にかけるってことですよね。勉強します。

ちなみに、subprocessモジュールでやる場合のやり方がよく分からないので教えていただけますでしょうか。
以下のように組んだのですが、
<open file '<fdopen>', mode 'rb' at 0x2b1268d74780>
というエラーが出てしまいます。

1 import subprocess
2 head=subprocess.Popen(['head','-n','20','test’],
3 stdout=subprocess.PIPE,
4 )
5 grep=subprocess.Popen(['grep','2011'],
6 stdin=head.stdout,
7 stdout=subprocess.PIPE,
8 )
9 wc=subprocess.Popen(['wc','-l'],
10 stdin=grep.stdout,
11 stdout=subprocess.PIPE,
12 )
13 end_of_pipe=wc.stdout
14 print end_of_pipe

お礼日時:2012/10/08 03:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!