繁体   English   中英

如何使用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)

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

然后,我希望第二个过程进入一个目录。

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

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

一般规则是,孩子不能影响父母的环境。

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

如果要使cd影响下一个dir命令,则需要将两者放在同一个子目录中。 例如:

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

您可能出于更一般的目的问了这个问题。 但是,对于您提供的特定示例,请注意,使用os模块而不是subprocess模块可以更好地执行这些操作:可以使用os.listdir来完成当前目录中文件的列出,并且可以通过更改当前工作目录来完成。用os.chdir完成

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

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

结果是,仅在关闭外壳时会丢失仅影响外壳的任何操作。 这样您就可以创建文件,并且会因为硬盘驱动器已更改而看到该文件。 但是,如果更改外壳程序的当前目录,则更改将丢失。

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

如果要更改当前目录,则需要os.chdir 通常,您应避免调用子流程,而应首选python的工具。 例如,使用os.listdir代替dir

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM