关于数组:执行python列表中的bash命令

Execute bash commands that are within a list from python

我拿到这个清单

1
commands = ['cd var','cd www','cd html','sudo rm -r folder']

我试图一个接一个地执行bash脚本中的所有元素,但没有成功。这里需要一个for循环吗?

如何做到这一点?谢谢大家!!!!!


这只是一个建议,但如果您只想更改目录和删除文件夹,可以使用os.chdir()shutil.rmtree()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from os import chdir
from os import getcwd
from shutil import rmtree

directories = ['var','www','html','folder']

print(getcwd())
# current working directory: $PWD

for directory in directories[:-1]:
    chdir(directory)

print(getcwd())
# current working directory: $PWD/var/www/html

rmtree(directories[-1])

这将使cd三个目录深入到html中,并删除folder中。当您调用chdir()时,当前工作目录会发生更改,如您调用os.getcwd()时所见。


1
2
for command in commands:
    os.system(command)

是你能做到的一种方法…虽然只是把CD放到一堆目录中不会有太大的影响

注意,这将在自己的子shell中运行每个命令…所以他们不会记得他们的状态(即任何目录更改或环境变量)

如果需要在一个子shell中运行它们,则需要将它们与"&;&;"链接在一起。

1
os.system(" &&".join(commands)) # would run all of the commands in a single subshell

如注释中所述,一般情况下,最好将子流程模块与check_call或其他变体一起使用。然而,在这个具体的例子中,我个人认为你是在6到1个半打打给另一个,而os.system打字较少(无论你是使用python3.7还是python2.5,它都会存在…但一般情况下使用subprocess,具体哪个调用可能取决于您使用的Python版本…在由@triplee链接的评论中有一个很好的描述,为什么应该使用子流程)

实际上,您应该将命令重新格式化为

commands = ["sudo rm -rf var/www/html/folder"]注意,您可能需要将python文件添加到sudoers文件中。

我也不确定你到底想在这里完成什么…但我怀疑这可能不是解决问题的理想方式(尽管它应该有效…)


1
2
3
4
5
6
7
8
9
10
declare -a command=("cd var","cd www","cd html","sudo rm -r folder")

## now loop through the above array
for i in"${command[@]}"
do
echo"$i"
# or do whatever with individual element of the array
done

# You can access them using echo"${arr[0]}","${arr[1]}" also