我正在尝试使用Python脚本和Windows任务计划程序在EC2上自动创建Windows映像。到目前为止,我将此作为我的工作基线代码。
awsstring1 = 'aws ec2 create-image --instance-id i-49a0a7b3 --name "Node.Js.ServerTest " --output text --description "Node.Js.ServerTest" --no-reboot'
subprocess.call(awsstring1)
现在我想在描述和名称上附加日期和时间作为附加信息。见下文
datestring = time.strftime("%c")
awsstring1 = 'aws ec2 create-image --instance-id i-49a0a7b3 --name "Node.Js.ServerTest %s" --output text --description "Node.Js.ServerTest %s" --no-reboot' %(datestring, datestring))
subprocess.call(awsstring1)
现在代码运行时没有错误,但它不会创建图像。是因为我创建awsstring1
的方式吗?如果是这样,有没有解决这个问题?
此外,有没有办法在运行subprocess.call
命令后获取输出?例如,我想捕获
subprocess.call('ls -a')
编辑: 当运行下面的代码时,它应该具有所创建图像的输出。
awsstring1 = 'aws ec2 create-image --instance-id i-9bedb4b4 --name "rwong_TestInstance" --output text --description "rwong_TestInstance" --no-reboot'
subprocess.call(awsstring1)
输出:
{
"ImageId": "ami-5731123e"
}
我需要那个ami-5731123e部分。如果有办法将它发送到一个很棒的文本文件。当我需要运行类似的命令来获取IP地址时,获取输出也会对我有所帮助。
Edit2:我编写了这段代码,用于将输出保存到文本文件,但是我收到“返回非零退出状态255”的错误。没有开头'和结束'的命令将在命令行上运行。是否有关于如何使用subprocess.check_call格式化这样的字符串的指南?
test = 'aws ec2 create-image --instance-id i-563b6379 --name "rwong_TestInstance" --output text --description "rwong_TestInstance" --no-reboot'
test2 = r' > "V:\rwong\Work Files\Python\test.txt"'
subprocess.check_call(test + test2)
答案 0 :(得分:0)
如果您阅读docs for subprocess.call
,则会发现您必须将多个参数作为list
传递,而不是作为subprocess.call
的字符串传递。
这意味着您应该执行以下操作:
awsstring1 = 'aws ec2 create-image --instance-id i-49a0a7b3 --name "Node.Js.ServerTest" --output text --description "Node.Js.ServerTest" --no-reboot'
subprocess.call(awsstring1.split())
请注意,这假设您希望按空格分割参数,这是shell默认工作的方式。或者,您可以通过将subprocess.call
作为关键字参数传递来强制shell=True
使用shell。默认值为False
。但是,这是不安全的,因为它会让你接受shell注入攻击。
另外,为了在不使用shell的情况下工作,你可能需要删除你的内部双引号,除非你希望那些字面上传递给aws
命令,我怀疑。
此外,我会使用subprocess.check_call
代替subprocess.call
来验证命令是否成功运行,而不是报告错误代码。
通常,要调试这些类型的问题,您应该在执行之前立即print
完整命令。然后尝试在命令行上手动执行它。如果手动执行它不起作用,则需要修复命令。如果手动执行它确实有效,那么它可能与用户或环境有关。在这两种情况下,请确保您以同一用户身份运行。您还可以使用env
命令打印出当前的环境变量。然后使用diff
进行比较。另一种可能性是提示与否的shell转义之间的差异,这就是为什么我之前提到双引号。
最后,要回答有关捕获输出的问题:subprocess.check_output
将执行您想要的操作。