2

我有一个脚本可以编译几个程序并将输出放入一个文件夹中,我的脚本中有一个函数可以迭代并找到文件夹中的所有可执行文件并将它们添加到列表中,

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

这在windows上没有任何问题,但是当我在mac上运行它时,我无法让它工作,当然mac中的编译文件不以“.exe”结尾,所以if语句没用,所以我制作了一个包含已编译文件名称的列表并将脚本更改为以下内容,但仍然没有结果,它添加了所有文件,包括我不想要的“.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
4

4 回答 4

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!'
于 2012-08-16T12:59:15.847 回答
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

我做了一些错误修复,也让事情变得更加pythonic。

于 2012-08-16T12:54:26.507 回答
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)测试执行权限。

于 2012-08-16T12:54:42.980 回答
0

Mac 上的答案比 Windows 上更难。Windows 上的默认二进制扩展名是 exe。Mac 上没有等价物。有二进制文件类型。它们通常可以与 Mac 上的 exe 进行比较。他们居住在很多地方。您可以在 /usr/bin 中看到其中很大一部分。

检查二进制文件类型是否是检查文件访问模式:

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

但是,当您说可执行文件时,您也可能是在谈论应用程序文件夹。在 Mac 上,这是 Windows 用户传统上认为的 exe 文件。大多数应用程序文件夹位于 /Applications 中。

您可以像这样获取应用程序文件夹的列表:

import os

appfolder = [name for name in os.listdir(".") if os.path.isdir(name) and name.endswith('.app')]
于 2012-08-16T13:10:01.767 回答