Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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
Windows 使用Python自动创建EC2_Windows_Python 2.7_Amazon Web Services_Amazon Ec2_Subprocess - Fatal编程技术网

Windows 使用Python自动创建EC2

Windows 使用Python自动创建EC2,windows,python-2.7,amazon-web-services,amazon-ec2,subprocess,Windows,Python 2.7,Amazon Web Services,Amazon Ec2,Subprocess,我正在尝试使用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) 现在

我正在尝试使用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\u调用执行的指南

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)
如果阅读,您将看到必须将多个参数作为列表而不是字符串传递给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的工作方式。或者,通过将shell=True作为关键字参数传递,可以强制subprocess.call使用shell。默认值为False。然而,这是不安全的,因为它使您容易受到shell注入攻击

另外,为了在不使用shell的情况下工作,您可能需要删除内部双引号,除非您希望将这些双引号直接传递给aws命令,我对此表示怀疑

此外,我将使用而不是subprocess.call来验证该命令是否已成功运行且未报告错误代码

通常,要调试这些类型的问题,您应该在执行之前立即打印完整的命令。然后尝试在命令行上手动执行它。如果手动执行不起作用,则需要修复该命令。如果手动执行确实有效,那么它可能与用户或环境有关。确保在这两种情况下都以同一用户的身份运行。还可以使用env命令打印出当前环境变量。然后使用diff来比较它们。另一种可能是提示符上的shell转义与否存在差异,这就是我前面提到双引号的原因


最后,回答您关于捕获输出的问题:将执行您想要的操作。

您提到您是通过Windows任务调度器执行此操作的,但请给出一个运行ls-a的示例,它不是Windows命令。您是否在windows平台上执行此操作?对于这个糟糕的示例,很抱歉。我更改了上面的帖子,以反映我运行subprocess.call的目标。如果不使用不安全的shell=True,您肯定无法执行文件重定向。因此,无论我去哪里,它看起来都是一条死胡同?如果您使用我在下面的回答中提到的检查输出,您可以将输出捕获为字符串,然后使用python使用标准io函数将其写入文件。如果仍然不起作用,那也没什么大不了的。我还编辑了我的帖子来回答您下面的问题。@RobertWong:在Windows上,您可以将命令作为字符串传递,因为它是本机接口。split在这里是不正确的,如果有空格,它会分割一个引用的参数。在Unix上,shlex.splitawstring可能会显示列表的外观,尽管存在边缘情况-您应该自己调整列表。