问题描述
我正在尝试从给定目录开始但向上而不是像os.walk中那样向下搜索特定目录。例如,此函数返回给定目录是否为Alire项目的根目录-这仅表示该目录包含alire / *。toml:
''' Check if this directory contains a 'alire/*.toml' file '''
def is_alire_root(dir):
dir = dir / "alire"
if dir.is_dir():
for x in dir.iterdir():
if x.suffixes == [".toml"]:
return True
return False
else:
return False
因此,给定一个谓词,该谓词告诉我们是否已找到所需目录,我将如何从给定路径向上搜索,例如
os_walk_upwards(os.path.abspath("."),is_alire_root)
会告诉我们当前目录或它上面的任何目录是否包含alire / *。toml?尽管os_walk_upwards可以用于各种搜索,但我专门在寻找可以作为Gnatstudio中的插件的东西。
解决方法
对于python版本> = 3.4,我们可以使用pathlib:
import os.path
from pathlib import Path
def is_alire_root(dir):
(... as above ...)
''' Search upwards from path for a directory matching the predicate '''
def os_walk_upwards(directory_predicate,path=Path(os.path.abspath("."))):
if directory_predicate(path):
return True
else:
parent = path.parent
if parent == path:
return False # reached root of filesystem
return directory_predicate(parent)
print(os_walk_upwards(is_alire_root))
但是Gnatstudio使用python 2.7.16,因此无法正常工作。而是使用:
import os.path
''' Check if this directory contains a 'alire/*.toml' file '''
def is_alire_root(dir):
dir = os.path.join(dir,"alire")
if os.path.isdir(dir):
for x in os.listdir(dir):
if os.path.splitext(x)[1] == ".toml": # will also match e.g. *.tar.gz.toml
return True
return False
else:
return False
''' Check if this or any parent directories are alire_root directories '''
def os_walk_upwards(directory_predicate,path=os.path.abspath(".")):
if directory_predicate(path):
return True
else:
parent = os.path.dirname(path)
if parent == path:
return False # reached root of filesystem
return directory_predicate(parent)
print(os_walk_upwards(is_alire_root))