执行子文件夹中的代码



我在一个文件夹(Data)中有子文件夹(data1、data2、data3),python(.py)程序存在于所有同名子文件夹中。我想在每个文件夹中运行这些python程序。

Data
data1/a.py
data1/b.py
data1/c.py

data2/a.py
data2/b.py
data2/c.py

data3/a.py
data3/b.py
data3/c.py

我尝试了以下代码:

for dir in Data/*
do
cd $dir
python *.py
done

但它不会执行子文件夹中的代码,有人能为它提出一个合适的解决方案吗。

不要用循环来执行此操作。假设您希望在Data/及其以下运行所有python脚本,并且希望这些脚本在当前工作目录下执行,该目录等于找到脚本的目录,请使用:

find Data -name '*.py' -execdir ./{} ;

如果您不想执行所有脚本,请适当地筛选find

例如,如果您只想运行名为a.pyb.pyc.py的脚本,可以使用:

find Data -name '[abc].py' -execdir ./{} ;

如果您的目录命名不正确,您可能还希望使用-type f来避免尝试执行名为a.py的目录。例如find Data -type f -name '[abc].py' -execdir ./{} ;

您可以通过指定目录来简单地限制作用域:find Data/data1 Data/data3 ...find Data/data[12] ...find Data/data[13] ...所有工作都符合预期。

我不认为您可以用一个命令运行多个Python脚本。但是您可以使用第二个for循环来实现这一点。

另一个问题是,在下一个循环迭代开始之前,您需要将cd备份到父目录;CCD_ 14和CCD_。

for dir in Data/*
do
pushd $dir
for script in *.py
do
python $script
done
popd
done

我不使用python,所以fwiw。。。

假设:

  • python可以使用作为输入一部分的目录/路径
  • 我们位于Data的父目录中
  • 我们希望执行位于Data下的所有*.py脚本

简化操作的一个想法:

while read -r script
do
python "${script}"
done < <(find Data -type f -name "*.py")

或者,将我们自己限制在特定的子目录中:

for script in Data/data{1..3}/*.py
do
python "${script}"
done

另一种方法是子shell。

您正在cd进入第一个目录,然后可能在下一个目录中出错,因为它不存在,即cd data1/的第一次迭代和其他迭代都不是它的子目录。

假设您的结构处于/tmp/之下。您已登录到/tmp/Data并运行您的脚本。第一个循环执行cd data1/,因此您现在已登录到/tmp/Data/data1/。让我们暂时跳过执行。。。

下一次迭代发布cd data2/,它不作为/tmp/Data/data1的子目录存在,因此它失败了,此时您应该希望python *.py会失败,或者至少是无害的幂等的。。。

所以,让我们尝试一个简单的解决方案。假设您已登录到存在Data子目录的目录,

for this in Data/*/*.py; do # iterate over the *scripts*
( cd "${this%/*}/" && python "$this" )
done

当子shell退出时,父级仍然记录到Data所在的目录。只有子shell执行了cd

或者,如果脚本不要求您登录到该目录,

for this in Data/*/*.py; do python "$this"; done

这对你有用吗?

相关内容

  • 没有找到相关文章

最新更新