【问题标题】:Different results when running in python interpreter vs. script file在 python 解释器与脚本文件中运行时的不同结果
【发布时间】:2013-06-17 15:59:10
【问题描述】:

我试图在我的 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。

【问题讨论】:

    标签: python bash grep subprocess


    【解决方案1】:

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

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

    您可以使用 ** 查看多个目录:

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

    这将匹配 /path/to/your/SomeDir/path/file。

    【讨论】:

    • 如果它是 /path/blah/foldername.1234 并且我只知道该目录的文件夹名称部分,那将如何工作?
    • 这个模块完美地替换了我代码中的 find,glob.glob("/path/to/dir/%s*" %part_of_foldername) 扩展到正确的路径。非常感谢!!!
    【解决方案2】:

    显然p1.communicate()[0].strip('\n') 正在返回一个空字符串。你真的像你的例子那样使用硬编码值"/path/to/directory"吗?

    【讨论】:

    • 是的,我看到它返回空字符串,但它在交互模式下不这样做。
    【解决方案3】:

    检查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')
    

    【讨论】:

    • 不幸的是,错字是我未能修改原始代码:(
    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多