3

Pythonスクリプト内でbash関数を使用して、特定のディレクトリを見つけて、ディレクトリ内の特定のファイルをgrepできるようにしようとしています。問題は、ディレクトリ名の一部しか持っていないことです。そのため、bash 関数 find を使用して残りのディレクトリ名を取得する必要があります (名前は一意であり、1 つのフォルダーのみが返されます)。

私がこれまでに持っているコードは次のとおりです。

def get_tag(part_of_foldername):
    import subprocess
    import os
    p1 = subprocess.Popen(["find", "/path/to/directory", "-maxdepth", "1", "-name", "%s.*" % part_of_foldername, "-type", "d"], stdout=subprocess.PIPE)
    directory = p1.communicate()[0].strip('\n')
    os.chdir(directory)
    p2 = subprocess.Popen(["grep", "STUFF_", ".hgtags"], stdout=subprocess.PIPE)
    tag = p2.comminucate()[0].strip('\n')
    return tag

これが本当に奇妙なことです。このコードは、インタラクティブに行ごとに入力すると機能しますが、スクリプトを介して実行すると機能しません。また、スクリプト ファイルをインタラクティブにインポートして関数を呼び出した場合にも機能しますが、メイン関数によって呼び出された場合には機能しません。スクリプトを直接実行して取得したトレースバックは次のとおりです。

Traceback (most recent call last):
File "./integration.py", line 64, in <module>
    main()  
File "./integration.py", line 48, in main
    tag = get_tag(folder)
File "./integration.py", line 9, in get_date
    os.chdir(directory)
OSError: [Errno 2] No such file or directory: ''

そして、次のようにメイン関数で呼び出されます。

if block_dict[block][0]=='0':
    tag = get_tag(folder)

「フォルダ」は以前に文字列として定義されています。

python 2.6 を使用しているため、残念ながらモジュール check_output を使用できないことに注意してください。

4

3 に答える 3

0

の結果を確認しp1.communicate()[0]ます。空の文字列かもしれません。

."%s.*" % part_of_foldername原因があるようです。

アップデート

タイプミスが見つかりました: comminucate->comminucate


def get_tag(part_of_foldername):
    p1 = subprocess.Popen(["find", "/path/to/directory", "-maxdepth", "1", "-name", "*%s*" % part_of_foldername, "-type", "d"], stdout=subprocess.PIPE)
    out, err = p1.communicate()
    directory = out.split('\n')[0]
    p1.wait()
    if directory:
        os.chdir(directory)
        p2 = subprocess.Popen(["grep", "STUFF_", ".hgtags"], stdout=subprocess.PIPE)
        out, err = p2.communicate()
        p2.wait()
        return out.rstrip('\n')
于 2013-06-20T17:17:55.983 に答える
0

find ではなくglobモジュールを使用してみましたか?

import glob
glob.glob("/path/to/directory/*/SomeDir/path/*")

** を使用して、複数のディレクトリを見渡すことができます。

glob.glob("/path/**/SomeDir/path/*")

これは /path/to/your/SomeDir/path/file に一致します。

于 2013-06-20T17:15:39.850 に答える
0

明らかにp1.communicate()[0].strip('\n')空の文字列を返しています。あなたの例のようにハードコードされた値を本当に使用してい"/path/to/directory"ますか?

于 2013-06-20T17:13:37.200 に答える