1

次のGNUfindコマンドを使用してディレクトリの内容を検索する必要があります。

パスの検索-typef-name file1 -o -name file2 -o -name file3

Linuxシェルでこのコマンドを実行すると、findコマンドは終了コード0で返されます。サブプロセス呼び出し内で同じコマンドを実行すると、findコマンドは終了コード1を返します。

import subprocess  
import shlex  
findcmd = "/depot/findutils/bin/find /remote/scratch/results -type f -name 'QUEUED' -o -name 'run.pid' -o -name 'PID'"
try:
    output = subprocess.check_output(shlex.split(findcmd))
except subprocess.CalledProcessError, cpe:
    print cpe.output
    raise cpe

出力:

Traceback (most recent call last):
  File "./getaverages.py", line 63, in <module>
    raise cpe
subprocess.CalledProcessError: Command '['/depot/findutils/bin/find', '/remote/scratch/results', '-type', 'f', '-name', 'QUEUED', '-o', '-name', 'run.pid', '-o', '-name', 'PID']' returned non-zero exit status 1

奇妙な部分は、CalledProcessErrorオブジェクトの出力属性が、Linuxシェルで実行したときに得られる出力とまったく同じであるということですfind(返される出力には約15K行が含まれています)。私もbufsize=-1を設定しようとしましたが、それは役に立ちませんでした。

この動作を理解するための提案はありますか?

私はPython2.7.2を使用しており、findバージョンは4.2.20です。

4

3 に答える 3

2

あなたが見つけた問題にもかかわらず、あなたが達成しようとしているような単純なことのために、私はshell-outではなく、代わりに使用os.walkします:

import os, os.path
search = 'file1 file2 file3'.split()
for root, dirs, files in os.walk('/path'):
  for f in filter(lambda x: x in search, files):
    # do something here
    fn = os.path.join(root, f)
    print 'FOUND', fn
于 2013-03-15T11:30:46.087 に答える
0

plumbumを使用すると、タスクは次のように簡単になります。

from plumbum.cmd import find
cmd = find['/remote/scratch/results']['-type', 'f']['-name','QUEUED']['-o']['-name', 'run.pid']['-o']['-name', 'PID']
cmd() # run it

逃げることを心配する必要はありません。これが問題の原因であると推測します。

于 2013-03-15T11:07:26.840 に答える
0

15K 出力の途中で、次の行を見逃したようです。

/depot/findutils/bin/find: /remote/scratch/results/tmp.na.8Em5fZ: No such file or directory
/depot/findutils/bin/find: /remote/scratch/results/tmp.na.k6iHJA: No such file or directory
/depot/findutils/bin/find: /remote/scratch/results/tmp.na.ZPe2TC: No such file or directory

検索しているパスにはシミュレーション結果が含まれており、3 日以上経過したファイルは定期的に削除されていることがわかりました。が実行されているときに削除が発生したことfindが問題の根本原因であるようです。

于 2013-03-15T11:14:06.083 に答える