2013-06-20 32 views
2

我想在我的python腳本中使用bash函數來定位特定的目錄,然後grep目錄中的給定文件。問題是我只有部分目錄名,所以我需要使用bash函數find來獲取目錄名的其餘部分(名稱是唯一的,並且只會返回一個文件夾)在python解釋器與腳本文件中運行時出現的不同結果

我有的代碼到目前爲止如下:

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不幸的是。

回答

0

您是否嘗試過使用glob模塊而不是查找?

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

你可以看看過去的多個dirctories使用**:

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

,並且將匹配/路徑/到/你/ SomeDir /路徑/文件。

+0

如果它是/path/blah/foldername.1234並且我只知道該目錄的文件夾名稱部分,它將如何工作? – user2506070

+0

**將匹配編輯的多個目錄。 –

+0

此模塊完全替代我的代碼中的查找, glob.glob(「/ path/to/dir /%s *」%part_of_foldername) 展開爲正確的路徑。非常感謝! – user2506070

0

顯然p1.communicate()[0].strip('\n')返回一個空字符串。你真的使用硬編碼值"/path/to/directory"在你的例子?

+0

是的,我看到它返回空字符串,但它並沒有這樣做,在交互模式。 – user2506070

0

檢查p1.communicate()[0]的結果。它可能是空的字符串。

. in "%s.*" % part_of_foldername似乎是原因。

UPDATE

發現錯字: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') 
+0

不幸的是,錯字是我沒有修改原來的代碼:( – user2506070

相關問題