Python 字符串格式化后找不到os.system命令
我试图在os.system命令中传递变量,但在字符串格式标记后出现错误消息“command not found”。它似乎试图在字符串格式化为命令后立即执行文本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
导入操作系统
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代码>