我试图在os.system命令中传递一个变量,但是在字符串格式标记之后我得到了一个错误消息“命令未找到”。它似乎试图在字符串格式化之后作为命令执行文本。
import os
BOOT_VOLUME_ATTACHMENT_ID = os.popen("terraform output | grep volume_attachment_id | cut -d ' ' -f 3").read()
os.system('oci compute boot-volume-attachment detach --force --wait-for-state DETACHED --boot-volume-attachment-id {0} --region region1' .format(BOOT_VOLUME_ATTACHMENT_ID))
其结果是错误如下:
sh: line 1: --region: command not found
为什么python试图在字符串格式化后立即执行字符串作为命令?
I使用Python2.7
更新.
问题似乎是在变量BOOT_VOLUME_ATTACHMENT_ID
中。如果我将这个变量更改为手动字符串,比如"123“,它可以正常工作。但是,如果我使用os.popen,则会看到上述错误
发布于 2019-08-08 04:33:57
除了os.system
以低于subprocess
的方式出现外,可能的问题是.format()
所做的替换过程。
与其使用代码,不如尝试
BOOT_VOLUME_ATTACHMENT_ID = "123"
print(repr('oci compute boot-volume-attachment detach --force --wait-for-state DETACHED --boot-volume-attachment-id {0} --region region1'.format(BOOT_VOLUME_ATTACHMENT_ID)))
看看它输出了什么。
这将告诉您,在--region
之前是否有什么奇怪的东西(例如,行中断)。
在您的问题更新之后,您的BOOT_VOLUME_ATTACHMENT_ID
显然不是您声称的那样。相反,它包含一个不同程序的输出,在大多数情况下,在末尾添加一个行中断。
如果您以这样的方式将该内容插入到字符串中,则这个断行符将被传输到目标字符串中,并告诉shell执行两个命令。
解决方案是在.strip()
调用之后立即使用os.popen()
。
关于子流程:
如果你这样做,你的程序就会变得更干净(例如,更少的注射倾向)。
import subprocess
BOOT_VOLUME_ATTACHMENT_ID = "123"
subprocess.call(['oci', 'compute', 'boot-volume-attachment', 'detach', '--force', '--wait-for-state', 'DETACHED', '--boot-volume-attachment-id', BOOT_VOLUME_ATTACHMENT_ID, '--region', 'region1'])
原因是这避免了程序和oci
之间的shell,从而消除了一个潜在的错误源。
https://stackoverflow.com/questions/57412627
复制相似问题