【问题标题】:Execute bash commands that are within a list from python执行 python 列表中的 bash 命令
【发布时间】:2019-04-18 01:11:26
【问题描述】:

我得到了这份清单

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

我正在尝试将里面的所有元素作为 bash 脚本一一执行,但没有成功。我需要一个 for 循环吗?

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

【问题讨论】:

标签: python arrays tuples


【解决方案1】:
for command in commands:
    os.system(command)

是你可以做到的一种方式......虽然只是 cd'ing 到一堆目录不会有太大的影响

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

如果你需要在一个子shell中运行它们而不是你需要用“&&”将它们链接在一起

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

如 cmets 中所述,通常最好使用带有check_call 或其他变体之一的子进程模块。但是在这个特定的例子中,我个人认为你是一个 6 比 1 的半打,而os.system 的打字更少(无论你使用的是 python3.7 还是 python2.5,它都会存在......但是一般使用subprocess 究竟哪个调用可能取决于您使用的python 版本...在@triplee @triplee why you should use subprocess instead 的cmets 链接的帖子中有很好的描述)

你真的应该把你的命令重新格式化为简单

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

我也不确定你在这里想要完成什么......但我怀疑这可能不是解决它的理想方式(虽然它应该工作......)

【讨论】:

  • 这行不通,因为cd var 会在子进程中运行,然后下一条命令会在父 Python 进程的(未更改的)目录中运行。
  • 没有规定它们都在同一个子shell中运行的条件......但我可以看到 OP 如何可能希望这种行为
  • 不,它没有拼写出来,可能 OP 甚至没有意识到这一点;但这是子流程中常见的错误。
  • 唉,你应该更喜欢subprocess.run()subprocess.check_call() 而不是os.system();请参阅我从上面另一条评论中链接的帖子。
  • 没有一个令人信服的理由适用于这里,恕我直言......它真的是6到1半打到另一个......事实上他正在使用命令这将需要shell=True,所以它非常有争议......总的来说是的......这只是更少的打字
【解决方案2】:
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

【讨论】:

【解决方案3】:

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

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() 时所见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 2023-02-14
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多