如何使用Python正确执行子进程

时间:2015-11-04 23:00:44

标签: python subprocess

我是python的新手,所以我在学习它的早期阶段。我想知道是否有人知道如何运行系统命令。很难解释:

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

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

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

然后第三个命令我希望看到更高的目录。我没有看到第一个目录。

有人可以解释为什么它没有像我预期的那样工作,我应该做些什么来纠正它。

3 个答案:

答案 0 :(得分:1)

一般规则是儿童不能影响父母的环境。

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

如果您希望cd影响下一个dir命令,则需要在相同的子项中同时使用这两个命令。例如:

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

您可能会将此问题用于更一般的目的。但是,对于您提供的具体示例,请注意使用os模块而不是subprocess模块可以更好地执行这些操作:当前目录中的列表文件可以使用{{1并且可以使用os.listdir

更改当前工作目录

答案 1 :(得分:0)

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

答案 2 :(得分:0)

当你使用shell=True运行子进程时,python启动一个新的shell来运行命令。它基本上与python启动一个新的命令提示符,在命令中输入然后关闭一样命令提示符。

结果是,当shell关闭时,任何只影响shell的动作都会丢失。因此,您可以创建文件,并且您将看到,因为硬盘驱动器已更改。但是,如果更改shell的当前目录,则更改将丢失。

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

如果要更改当前目录os.chdir。通常,您应该避免调用子进程并更喜欢python的工具。例如,代替dir使用os.listdir