Python 字符串格式化后找不到os.system命令

Python 字符串格式化后找不到os.system命令,python,python-2.7,Python,Python 2.7,我试图在os.system命令中传递变量,但在字符串格式标记后出现错误消息“command not found”。它似乎试图在字符串格式化为命令后立即执行文本 导入操作系统 BOOT_VOLUME_ATTACHMENT_ID=os.popen(“地形输出| grep VOLUME_ATTACHMENT_ID | cut-d'-f3”).read() system('oci compute boot volume attachment detach--force--wait for state D

我试图在os.system命令中传递变量,但在字符串格式标记后出现错误消息“command not found”。它似乎试图在字符串格式化为命令后立即执行文本

导入操作系统
BOOT_VOLUME_ATTACHMENT_ID=os.popen(“地形输出| grep VOLUME_ATTACHMENT_ID | cut-d'-f3”).read()
system('oci compute boot volume attachment detach--force--wait for state DETACHED--boot volume attachment id{0}--region region1'。格式(boot_volume_attachment_id))
结果是以下错误:

sh: line 1: --region: command not found
为什么python要在字符串格式化之后作为命令执行字符串

我正在使用Python2.7

更新


问题似乎出在变量
BOOT\u VOLUME\u ATTACHMENT\u ID
中。如果我把这个变量改为手动字符串,比如说“123”,就可以了。但是,如果我使用os.popen,那么我会看到所提到的错误

除了
os.system
远不如
子流程
,可能的问题是
.format()
完成的替换过程

你应该试试,而不是你的代码

BOOT\u VOLUME\u ATTACHMENT\u ID=“123”
打印(repr('oci compute boot volume attachment detach--force--wait for state DETACHED--boot volume attachment id{0}--region region1'。格式(boot_volume_attachment_id)))
看看它输出了什么

这将告诉您在
--区域
之前是否有异常情况(例如换行)

在您的问题更新之后,您的
BOOT\u VOLUME\u ATTACHMENT\u ID
显然不是您声称的那样。相反,它包含不同程序的输出,在大多数情况下,该程序会在末尾添加换行符

如果您获取该内容并像以前那样将其插入到字符串中,此换行符将被传输到目标字符串中,告诉shell执行两个命令

解决方案是在调用
os.popen()
之后立即使用
.strip()


关于子流程:

如果您这样做,您的程序将变得更干净(例如,不易注射)

导入子流程
启动\u卷\u附件\u ID=“123”
子进程调用(['oci','compute','boot volume attachment','detach','--force','--wait for state','DETACHED','--boot volume attachment id',boot_volume_attachment_id',--region','region1'])

原因是这样可以避免在程序和
oci
之间使用外壳,从而消除一个潜在的错误源。

除了
os.system
子进程
差之外,可能的问题是
.format()
完成的替换过程

你应该试试,而不是你的代码

BOOT\u VOLUME\u ATTACHMENT\u ID=“123”
打印(repr('oci compute boot volume attachment detach--force--wait for state DETACHED--boot volume attachment id{0}--region region1'。格式(boot_volume_attachment_id)))
看看它输出了什么

这将告诉您在
--区域
之前是否有异常情况(例如换行)

在您的问题更新之后,您的
BOOT\u VOLUME\u ATTACHMENT\u ID
显然不是您声称的那样。相反,它包含不同程序的输出,在大多数情况下,该程序会在末尾添加换行符

如果您获取该内容并像以前那样将其插入到字符串中,此换行符将被传输到目标字符串中,告诉shell执行两个命令

解决方案是在调用
os.popen()
之后立即使用
.strip()


关于子流程:

如果您这样做,您的程序将变得更干净(例如,不易注射)

导入子流程
启动\u卷\u附件\u ID=“123”
子进程调用(['oci','compute','boot volume attachment','detach','--force','--wait for state','DETACHED','--boot volume attachment id',boot_volume_attachment_id',--region','region1'])

原因是这样可以避免在程序和oci之间使用shell,从而消除一个潜在的错误源。

您确定--区域是一个有效选项吗?@jammydowger为什么不应该?毕竟,它是
sh
抱怨它是一个命令。@JammyDodger是我确信的,如果用其他东西交换文本,比如说“启动卷附件”,它会出错,因为找不到命令“启动卷附件”:/看起来你的sting和format语句之间有一个额外的空间,这可能只是一个输入错误,但也可能导致您的issue@Joe刚刚尝试过,同样的错误:-(你确定--区域是一个有效的选项吗?@jammydower为什么不应该?毕竟,它是
sh
抱怨它作为一个命令。@jammydower是我确定的,如果用其他东西交换文本,让我们说“启动卷附件”命令未找到“启动卷附件”时会出错:/看起来您的sting和format语句之间有一个额外的空间,这可能只是一个输入错误,但也可能导致您的错误issue@Joe刚试过,同样的错误:-(实际上末尾有3个括号,你漏掉了一个。输出打印的命令看起来不错。我甚至复制粘贴了该命令,效果很好。但是当它在python中运行时,失败了,出现了相同的错误。我将尝试子进程,看看会发生什么。它打印什么?@glglgl-yup…你是对的,mate..os.peopen将添加一个
\n
这导致了错误。我可以通过“打印(repr)”看到它最后实际上有3个括号,你错过了一个。输出打印命令,看起来还可以。我甚至复制粘贴了命令,工作正常。但在python中运行时,它失败了,出现了相同的错误。我将尝试子进程,看看会发生什么。它打印什么?@glglgl-yup…你是对的,mate.。os.peopen将添加一个
\n