2

MacOS10.6.8でPython3.3を実行しています。複数のサブプロセスを実行するスクリプトを作成していますが、各サブプロセスの出力をキャプチャしてファイルに記録したいと思います。私はこれに問題があります。

私は最初に次のことを試しました:

import subprocess
logFile = open("log.txt", 'w')
proc = subprocess.Popen(args, stdout=logFile, stderr=logFile)
proc.wait()

これにより、空のlog.txtが生成されました。インターネットで少し調べた後、代わりにこれを試しました

import subprocess
proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = proc.communicate()
logFile = open("log.txt", 'w')
logFile.write(output)

これも空のlog.txtを生成しました。そのため、ファイルに書き込む代わりに、出力をコマンドラインに出力しようとしました。

output, err = proc.communicate()
print(output)
print(err)

それはこれを生み出しました:

b''
b''

私が実行しようとしているプロセスはfastq_quality_trimmerです。入力ファイルを受け取り、それをフィルタリングして、結果を新しいファイルに保存します。stdoutに数行を書き込むだけです。

Minimum Quality Threshold: 20
Minimum Length: 20
Input: 750000 reads.
Output: 750000 reads.
discarded 0 (0%) too-short reads.

コマンドラインから実行して、次のように出力をリダイレクトすると

fastq_quality_trimmer -Q 33 -v -t 50 -l 20 -i in.fq -o in_trimmed.fq > log.txt

出力はlog.txtに正常に書き込まれます。

Popenで呼び出したときに、fastq_quality_trimmerの実行に失敗したのではないかと思いましたが、スクリプトは、コマンドラインからfastq_quality_trimmerを実行したときに生成されたものと同じフィルター処理されたファイルを生成します。だからそれは働いています; 出力をキャプチャできません。さらに混乱させるために、私が投稿したものと本質的に同じコードを使用して、他のプロセス(エコー、他のPythonスクリプト)の出力を正常にキャプチャできます。

何かご意見は?私は盲目的に明白な何かを見逃していますか?

4

1 に答える 1

2

カンマを忘れました:

["fastq_quality_trimmer", "-Q", "33" "-v", "-t", "50", "-l", "20", "-i", leftInitial, "-o", leftTrimmed]

"33"との間に追加し"-v"ます。

-Q 33-v基本的に、の代わりに引数を渡します-Q 33 -v

Pythonは、2つの隣接する文字列の間に空白しかない場合、それらを連結します。

>>> "33", "-v"
('33', '-v')
>>> "33" "-v"
'33-v'

-vは、出力を生成するために必要な冗長スイッチであるため、fastq_quality_trimmerそれが欠落している状態でサイレントのままになります。

サブプロセスの呼び出しで問題が発生した場合は、作成されたコマンドラインを3回確認してください。でプリペンディングargsすると、次の['echo']ことが役立ちます。

proc = subprocess.Popen(['echo'] + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = proc.communicate()
print(output)
于 2013-01-11T16:28:27.787 に答える