2012-08-16 24 views
2

我有一個編譯少量程序並將輸出放到一個文件夾中的腳本,我在腳本中有一個函數用於迭代並找到文件夾中的所有可執行文件並將它們添加到列表,在mac中找到特定類型的文件(python)

def _oswalkthrough(direc,filelist=[]): 
    dirList=os.listdir(direc) 
    for item in dirList: 
     filepath = direc+os.sep+item 
     if os.path.isdir(filepath): 
      filelist = _oswalkthrough(filepath,filelist) 
     else: 
      if ".exe" == item[-4:]: 
       filelist.append(filepath) 
    return filelist 

這適用於任何問題的窗口,但是當我在Mac上運行此,我無法得到它的工作,當然在Mac編譯後的文件不是結束「 .exe「,這樣如果語句無用,所以我做了一個包含編譯文件名稱的列表,並將腳本更改爲以下內容,但仍然沒有結果,它添加了所有文件,包括」.o「文件,我不想要!我只想要exe文件? (我不知道他們在mac中稱爲什麼!)。

def _oswalkthrough(direc,filelist=[]): 
    dirList=os.listdir(direc) 
    for item in dirList: 
     filepath = direc+os.sep+item 
     if os.path.isdir(filepath): 
      filelist = _oswalkthrough(filepath,filelist) 
     else: 
      for file in def_scons_exe: 
       if file == item[-4:]: 
        filelist.append(filepath) 
    return filelist 
+0

你應該看看了'os.walk'。你可以建立這個列表,而不用'_oswalkthrough'遞歸。 – mgilson 2012-08-16 12:56:48

回答

0

貌似部分:

for file in def_scons_exe: 
    if file == item[-4:]: 
     filelist.append(filepath) 

應該是:

for file in def_scons_exe: 
    if file == item[-len(file):]: 
     filelist.append(filepath) 
     break 

這一變化使得程序查找任何長度的延伸,而不是僅僅4個字符。當它找到匹配的時候,它也停止查看擴展。

此外,您應該嘗試使用os.walk函數簡化代碼以及os.access([path], os.X_OK)以測試執行權限。

+0

這個固定它:) – cyberbemon 2012-08-16 13:14:55

1

您可以使用os.access檢查它在Mac,Linux和Windows太:

def _oswalkthrough(direc,filelist=[]): 
    dirList=os.listdir(direc) 
    for item in dirList: 
     filepath = os.path.join(direc,item) 
     if os.path.isdir(filepath): 
      filelist.extend(_oswalkthrough(filepath)) 
     elif os.access(filepath, os.X_OK): 
      filelist.append(filepath) 
    return filelist 

我做了一些bug修復和扭轉乾坤更Python了。

+0

指出'os.walk'是這個遞歸函數的一個更好的選擇... – mgilson 2012-08-16 12:55:04

2

首先,您的代碼在Mac上無法使用,因爲例如您的條件if file == item[-4:]將不適用於.o(它們的長度不同,它們將不會相等)。

另一件事,看看os.walk函數(它會節省你的路徑遍歷一些空間)。

另一個問題是檢查擴展名不能保證文件是可執行的。您最好使用os.access來檢查文件訪問模式,對於您的情況(您想知道它是否可執行),您必須檢查os.X_OK標誌。這裏有一個檢查代碼片段:

import os 

if os.access("/path/to/file.o", os.X_OK): 
    print 'Executable!' 
+0

我已經有一個單獨的函數來檢查文件是否可執行或不可執行。目前的功能不斷添加.o文件,我不想要它們。 – cyberbemon 2012-08-16 13:15:53

0

在Mac上的答案比在Windows上更難。在Windows上的默認二進制擴展名是EXE。 Mac上沒有相應的功能。有二進制文件類型。它們是傳統上可以與Mac上的exe相比較的。他們居住在很多地方。你可以在/ usr/bin中看到它們中的一大塊。

要檢查二進制文件類型檢查文件訪問模式:

is_executable = os.access(path, os.X_OK) 

但是,當你說可執行文件還可以談論一個app文件夾。在Mac上,這是Windows用戶傳統上認爲的exe文件。大多數應用程序文件夾駐留在/ Applications中。

你可以得到app文件夾列表,像這樣:

import os 

appfolder = [name for name in os.listdir(".") if os.path.isdir(name) and name.endswith('.app')] 
相關問題