我有一个编译很少程序并将输出放到文件夹中的脚本,我的脚本中有一个函数可以迭代并找到文件夹中的所有可执行文件并将它们添加到列表中,
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”结尾,所以如果语句没用,所以我创建了一个包含已编译文件名称的列表,并将脚本更改为以下内容,但仍然没有结果,它添加了所有文件,包括“.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 :(得分: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!'
答案 1 :(得分: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
我做了一些错误修复,并将事情变得更加诡异。
答案 2 :(得分: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)
来测试执行权限。
答案 3 :(得分:0)
Mac上的答案比在Windows上更难。 Windows上的默认二进制扩展名是exe。在Mac上没有相同的功能。有二进制文件类型。它们可以经典地与Mac上的exe进行比较。他们住在很多地方。你可以在/ usr / bin中看到它们中的一大块。
检查二进制文件类型是否检查文件访问模式:
is_executable = os.access(path, os.X_OK)
但是当你说可执行文件时,你也可以谈论一个app文件夹。在Mac上,Windows用户传统上认为是exe的。大多数app文件夹都位于/ Applications。
你可以获得一个app文件夹列表,如下所示:
import os
appfolder = [name for name in os.listdir(".") if os.path.isdir(name) and name.endswith('.app')]