2016-05-11 21 views
0

背景として、fileListというフルパス(/.../filea.dat)という異なるファイル名の要素を持つリストを作成しました。形式はfileList = ['/../filea.dat', '/../fileb.dat']です。サブプロセスコマンドを使用してファイルの変数リストをループしている間にエラーが発生しました

このファイルのリスト内のすべてのファイルに対してサブプロセスコマンドを実行し、後で各ファイルのコンポーネント(および生成された新しいファイル)を別々に分析したいとします。

for i, elem in enumerate(fileList): 
    hexed = fileList[i] 
    subprocess.Popen("hexdump " + hexed + " > hexed.dat", shell=True) 

    with open("hexed.dat", "r") as f: 
     for line in f: 
     if "statement" in line: 
      value = "examplevalue" 
    if value == "examplevalue" 
     other subprocess statements that create a file that will again be used later 

今私はTypeError: cannot concatenate 'str' and 'list' objectsを持っています。私が正しい方法でこの方法のアプローチをしているかどうか教えてください。

追加の説明をする必要がある場合はお知らせください。私は、他の詳細は問題に重要ではないので、基本に単純化しようとしました。

+0

1-タイプエラーを修正したい場合は、「TypeError」について質問してください(エラーメッセージはかなり明確ですが、完全なトレースバックを追加してください)。したがって、あなたの質問は他の人にも役立つかもしれません。サブプロセスの出力を行ごとに読み取る方法を知りたい場合は、それについて質問してください(既存の質問は多いですが)。 Pythonでファイルを16進化する方法を知りたければ、あなたは別の質問としてそれについても尋ねることができます( 'hexdump'を実行する必要はありません)。あなたの質問を1つの質問ごとに制限してみてください。 – jfs

+0

私はマルチパートの質問が理想的ではないことがわかりますが、私にとっては多くの問題が結びついています。あなたが言うように、hexdumpのための他のオプションがありますが、私はサブプロセスを使ってhexdumpの横にある他のものを実行していますが、これはここで伝えるのが簡単な部分でした。私はあなたに他の質問をしていることを保証します、私は単に自分の状況に役立つ答えを見つけられませんでしたので、私は質問を投稿しました。 – stackofpancakes

+0

[サブプロセスタグ情報](http://stackoverflow.com/tags/subprocess/info)によくある質問 – jfs

答えて

2

あなたは近くにいます。 Popenは、リストの代わりに文字列を渡すときにもshell=Trueを設定する必要があるため、タイプエラーが発生しました。しかし、別の問題があります:Popenは、プロセスを完了するのを待たずにファイルを読み込んだときに、まだそれに役立つものはありません。別の戦略は、ファイルのリダイレクトをスキップし、出力ストリームを直接読み取ることです。 enumerateを使用する必要はないことにも注意してください。forループはすでにリストの値を取得しています。シェルをスキップしてコマンドをリストとして渡すことができます。

for hexed in fileList: 
    proc = subprocess.Popen(["hexdump", hexed], stdout=subprocess.PIPE, 
     stderr=open(os.devnull, 'w')) 
    for line in proc.stdout: 
     if "statement" in line: 
      value = "examplevalue" 
    proc.wait() 
    if proc.returncode != 0: 
     print('error') # need less lame error handling! 
    if value == "examplevalue" 
     other subprocess statements that create a file that will again be 
+0

私は実際にshell = Trueを持っていました。私はあなたの調整をしました、そして、今は適切に実行されているようです。しかし、もともと私は、コードの他の部分にそれらの生成されたファイルを見て、追加のファイルを生成させるので、その出力をファイルに入れたいと思っていました。私は後で私はそれらのファイルを生成する必要がありますstdoutのショートカットを引き出すことができるとは思わない。 – stackofpancakes

関連する問題