3

我试图在我的 python 脚本中使用 bash 函数来允许我找到一个特定的目录,然后 grep 目录中的给定文件。问题是我只有部分目录名,所以我需要使用 bash 函数 find 来获取目录名的其余部分(名称是唯一的,并且只会返回一个文件夹)

我到目前为止的代码如下:

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].strip('\n')是返回一个空字符串。你真的"/path/to/directory"在使用你的例子中的硬编码值吗?

于 2013-06-20T17:13:37.200 回答
0

您是否尝试过使用glob模块而不是 find ?

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]。它可能是空字符串。

."%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 回答