Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 执行windows shell命令并处理输出变量_Python_Python 3.x_Cmd_Terraform - Fatal编程技术网

Python 执行windows shell命令并处理输出变量

Python 执行windows shell命令并处理输出变量,python,python-3.x,cmd,terraform,Python,Python 3.x,Cmd,Terraform,在Windows上运行的Python 3.7中,需要什么特定语法: 1. Navigate to a directory containing a terraform program 2. Execute "terraform apply -auto-approve" in that target directory 3. Extract the resulting output variables into a form usable in python 输出变量可能采用以下形式

在Windows上运行的Python 3.7中,需要什么特定语法:

1. Navigate to a directory containing a terraform program  
2. Execute "terraform apply -auto-approve" in that target directory  
3. Extract the resulting output variables into a form usable in python  
输出变量可能采用以下形式:

security_group_id_nodes = sg-xxxxxxxxxx  
vpc_id_myvpc = vpc-xxxxxxxxxxxxx   
希望在此处使用windows cmd样式的命令,而不是powershell

我第一次失败的新手尝试是:

import os

os.chdir('C:\\path\\to\\terraform\\code')

from subprocess import check_output
check_output("terraform apply -auto-approve", shell=True).decode()

不确定您的输出,但子流程肯定会成功

尝试以下方法:

command = 'terraform apply -auto-approve'
TARGET_DIR = 'E:\Target\Directory'
subprocess_handle = subprocess.Popen(shlex.split(command), cwd=TARGET_DIR, shell=False, stdout=subprocess.PIPE)
subprocess_handle.wait()

result = subprocess_handle.communicate()[0]
print(result)
为我工作过一次,只是和情妇们玩玩


UPD:在这里,我假设“terraform”是一个可执行文件。

为什么不开始,但展示您已经尝试过的内容,使用子流程和os@d_kennetz我加了一些简单的东西。一开始我没有包括它的原因是因为它太少了。我想帮助理解如何处理这个简单的构建块,以便我可以从中构建。你有什么建议?@down投票者发布一个链接,链接到你认为答案是什么,或者是如何改进问题的建议。没有路过射击。Terraform是可执行的。然而,您建议的代码只是无限期地挂起,没有给出任何输出来解释正在发生的事情。@CodeMed,可能是这样的。这在很大程度上取决于程序的工作方式。您是否尝试使用
print()
检查它是否挂起
wait()
或稍后的某个位置?选项包括:尝试“shell=True”,异步使用子进程(即不等待它完成),并且程序可能不会向stdout写入任何内容(示例正在尝试获取它)。恐怕这里的大部分工作都是尝试和错误的方法。下面打印过程中的结果
subprocess.run(“terraform应用-自动批准”,shell=True,check=True)
。程序运行成功。但是,如何将输出导入某种处理,以便提取输出变量呢?但是为了让我仍然可以在命令行中看到正在运行的输出,以便能够理解发生了什么?@CodeMed,您可以自己用Python代码打印输出,而不是使用
shell=True
。不完全确定细节,但是
run()
也应该支持stdout重定向。因此,沟通应该是有效的。类似于“读取输出直到程序终止”。也不能指向异步配方,但这只是因为我必须自己用谷歌搜索它=)希望,你不再使用等待,是吗?