0

サブプロセスライブラリを使用して、Pythonモジュールからgrepコマンドを実行しようとしています。docファイルでこの操作を行っているので、Catdocサードパーティライブラリを使用して、プランテキストファイルのコンテンツを取得しています。コンテンツをファイルに保存したい。どこが間違っているのかわかりませんが、プログラムはプレーンテキストファイルを生成できず、最終的にgrepの結果を取得できません。エラーログを確認しましたが、空です。すべての助けをありがとう。

def search_file(name, keyword):
    #Extract and save the text from doc file
    catdoc_cmd = ['catdoc', '-w' , name, '>', 'testing.txt']
    catdoc_process = subprocess.Popen(catdoc_cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
    output = catdoc_process.communicate()[0]
    grep_cmd = []
    #Search the keyword through the text file
    grep_cmd.extend(['grep', '%s' %keyword , 'testing.txt'])
    print grep_cmd
    p = subprocess.Popen(grep_cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True)
    stdoutdata = p.communicate()[0]
    print stdoutdata
4

2 に答える 2

4

UNIXでは、指定shell=Trueすると、最初の引数が実行するコマンドとして扱われ、後続のすべての引数がシェル自体への引数として扱われます。したがって、は>効果がありません(と/bin/sh -cの場合、コマンドの後のすべての引数は無視されます)。

したがって、実際に使用する必要があります

catdoc_cmd = ['catdoc -w "%s" > testing.txt' % name]

ただし、より良い解決策は、おそらくサブプロセスからテキストを読み取り、またはPython文字列操作stdoutを使用して処理することです。re

catdoc_cmd = ['catdoc', '-w' , name]
catdoc_process = subprocess.Popen(catdoc_cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
for line in catdoc_process.stdout:
    if keyword in line:
        print line.strip()
于 2012-10-07T01:06:57.320 に答える
2

>をシェルに渡そうとしていると思いますが、それはあなたが行ったようには機能しません。プロセスを生成する場合は、その標準がリダイレクトされるように調整する必要があります。幸いなことに、それは本当に簡単です。あなたがしなければならないのは、出力が書き込みのために行きたいファイルを開き、それをPIPEの代わりにstdoutキーワード引数を使用してpopenに渡すことです。これにより、communicate()で読み取ることができるパイプに接続されます。 。

于 2012-10-07T01:07:39.447 に答える