【发布时间】:2014-04-05 11:37:40
【问题描述】:
我正在尝试使用 python 自动化一个过程。如果我只是在终端中,工作流程如下所示:
user:> . /path/to/env1.sh
user:> python something.py
user:> exit
user:> . /path/to/env2.sh
user:> python something2.py
user:> exit
等更多步骤。每个env.sh 都会生成一个新脚本,其中包含大量环境变量以及当前目录中未设置的内容。我很确定我需要使用子流程,但我不确定如何去做。理想情况下,工作流程应该是:打开新的 shell --> 运行一些命令 --> 退出 shell --> 必要时重复。
编辑:似乎需要澄清一下。我了解如何使用 subprocess.Popen() 和 subprocess.call() 从调用 Python 脚本的 shell 中调用事物。这不是我需要的。当一个人调用env.sh 时,它会设置一大堆环境变量和一些其他相关的东西,然后让你进入一个 shell 来运行命令。重要的是要注意env.sh 不会终止,直到在运行所需的命令后键入exit。使用subprocess.call("./env.sh", shell = True) 打开外壳并停在那里。就像输入命令./env.sh 一样,除了当发出exit 命令时,其余的python 脚本。所以:
subprocess.call(". /path/to/env.sh", shell = True)
subprocess.call("python something.py", shell = True)
不做我需要做的事,也不做:
p = subprocess.Popen(". /path/to/env.sh", shell = True)
subprocess.call("python something.py", shell = True)
p.kill()
【问题讨论】:
-
我的解决方案是使用 Popen.communcate() 但是我确实在让我的输入通过时遇到了一些麻烦,但我在这里找到了答案:stackoverflow.com/questions/12965023/… one need to import PIPE from subprocess to be能够将字符串传递给您的子进程。我不完全确定要选择哪个答案,因为它们都不是完全正确的,而且许多建议的模块都将被弃用。
-
如果您认为自己知道答案,则将其发布为作为答案而不是评论并接受。
标签: python bash shell subprocess