我如何使用 Python 正确执行子流程

How do i do sub processes properly with Python

我是 python 的新手,所以我还处于学习的早期阶段。我想知道是否有人知道如何 运行 一条又一条的系统命令。不好解释:

subprocess.call('dir',shell=True)
subprocess.call('cd ..',shell=True)
subprocess.call('dir',shell=True)

当我 运行 命令时,我希望看到文件所在的目录 运行。很好。

然后第二个进程我希望上一个目录。

然后第三条命令我预计会看到上层目录。我没有,我只看到了第一个目录。

有人可以解释为什么它没有按我预期的那样工作,以及我应该如何纠正它。

如果您尝试更改 python 中的工作目录,只需通过 os 模块即可完成。您可以找到该文档 here。我建议仅使用 subprocess.call 来调用脚本或其他不尝试根据当前环境修改内容的程序。

当你 运行 一个带有 shell=True 的子进程时,python 启动一个新的 shell 到 运行 中的命令。它基本上是相同的好像python启动一个新的命令提示符,输入命令,然后关闭命令提示符。

结果是,当 shell 关闭时,任何仅影响 shell 的操作都会丢失。所以你可以创建文件,你会看到,因为硬盘驱动器被改变了。但是,如果您更改 shell 的当前目录,则更改将会丢失。

您可能想知道程序的输出。基本上,默认是将程序的输出复制到调用程序的输出。 (您可以覆盖它。)

如果你想改变你想要的当前目录os.chdir。通常,您应该避免调用子流程,而更喜欢 python 的工具。例如,使用 os.listdir 而不是 dir

一般规则是 children 不能影响 parent 的环境。

subprocess.call 创建一个 child 进程。 child 进程可以做很多事情。但是,它对当前工作目录或环境变量所做的任何更改仅在子进程调用期间持续。调用完成并控制returns到parent后,parent的环境恢复不变。

如果您希望 cd 影响下一个 dir 命令,您需要在 same child 中同时拥有这两个命令。例如:

subprocess.call('cd ..; dir', shell=True)

您问这个问题可能是出于更一般的目的。但是,对于您提供的具体示例,请注意,使用 os 模块可能会更好地执行这些操作,而不是 subprocess 模块:可以使用 [=16] 完成当前目录中的列表文件=] 并可以使用 os.chdir

更改当前工作目录