1

これをシェルで実行すると、具体的な結果が得られます。

wget -O c1 --no-cache "http://some.website" | sed "1,259d" c1 | sed "4,2002d"

Pythonでこれを行うと、何も得られません。

subprocess.call(shlex.split("wget -O c1 --no-cache \"http://some.website/tofile\""))
c1 = open("c1",'w')
first = subprocess.Popen(shlex.split("sed \"1,259d\" c1"), stdout=subprocess.PIPE)

subprocess.Popen(shlex.split("sed \"4,2002d\""), stdin=first.stdout, stdout=c1)
c1.close()

これを行っても結果は得られません。

c1.write(subprocess.Popen(shlex.split("sed \"4,2002d\""), stdin=first.stdout, stdout=subprocess.PIPE).communicate()[0])

「何も得られない」とは、ファイル内の空白の出力を意味します。誰かがここで普通でない何かを見ますか?

4

4 に答える 4

2

このステートメントは、書き込み用にc1 = open("c1",'w')ファイルを開きc1、既存のデータをすべて切り捨てるため、sed を呼び出す前に wget がファイルに書き込んだものはすべて消去されます。

shlex.splitとにかく、一般的には厄介だと思います。args リストを手動で作成することを好みます。

from subprocess import Popen, PIPE

p0 = Popen(['wget', '-O', '-', 'http://www.google.com'], stdout=PIPE)
p1 = Popen(['sed', '2,8d'], stdin=p0.stdout, stdout=PIPE) 
with open('c1', 'w') as c1:
    p2 = Popen(['sed', '2,7d'], stdin=p1.stdout, stdout=c1)
    p2.wait()

ただし、Python プログラマーが sed を呼び出さなければならない明確な理由はありません。Python には文字列メソッドと正規表現があります。また、 wget の代わりに を使用できますurllib2.urlopen

于 2013-03-14T08:47:43.630 に答える
1

すべてをパイプで実行し、出力をファイルに送信しないのはなぜですか?

wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d" > c1

または、ファイルに送信したくない場合は、代わりに標準出力に送信します。

wget -O - "http://www.google.com" | sed "1,259d" | sed "4,2002d"

Python で実行する場合は、次のようにします。

pipe = subprocess.Popen(shlex.split("wget -O - \"http://www.google.com\" | sed \"1,259d\" | sed \"4,2002d\""), stdout=subprocess.PIPE)
result = pipe.communicate()[0]
于 2013-03-14T06:18:51.850 に答える
0

多かれ少なかれ同じタイプの問題に遭遇している可能性のある人々の生活を楽にするためにc1、データの上書きとコメントを考慮に入れた最終的な改訂コードを投稿することにしました。特に興味深いのは、communicate()非常に苛立たしいゾンビプロセスの兆候を完全に排除するのに役立った which の使用法です。subprocess.callまた、配管が不要な部分にも使えて重宝しました。結局必要ありませんでしwait()た。最終的にsedwget、特に Python の組み込みツールとurllib2.

p0 = subprocess.call(shlex.split("wget -Oc1 --no-cache \"http://Some.website/tofile\""))
p1 = subprocess.Popen(shlex.split("sed \"1,261d\" c1"), stdout=subprocess.PIPE)

with open("cc1", 'w') as cc1:
    p2 = subprocess.Popen(shlex.split("sed \"3,2002d\""), stdin=p1.stdout, stdout=cc1)
    p2.communicate()
    p1.communicate()
    p3 = subprocess.call(shlex.split("mv cc1 c1"))
于 2013-03-15T06:42:13.477 に答える