首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串格式化后找不到os.system命令

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

Stack Overflow用户
提问于 2019-08-08 12:29:16
回答 1查看 597关注 0票数 0

我试图在os.system命令中传递一个变量,但是在字符串格式标记之后我得到了一个错误消息“命令未找到”。它似乎试图在字符串格式化之后作为命令执行文本。

代码语言:javascript
运行
复制
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))

其结果是错误如下:

代码语言:javascript
运行
复制
sh: line 1: --region: command not found

为什么python试图在字符串格式化后立即执行字符串作为命令?

I使用Python2.7

更新.

问题似乎是在变量BOOT_VOLUME_ATTACHMENT_ID中。如果我将这个变量更改为手动字符串,比如"123“,它可以正常工作。但是,如果我使用os.popen,则会看到上述错误

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-08 12:33:57

除了os.system以低于subprocess的方式出现外,可能的问题是.format()所做的替换过程。

与其使用代码,不如尝试

代码语言:javascript
运行
复制
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()

关于子流程:

如果你这样做,你的程序就会变得更干净(例如,更少的注射倾向)。

代码语言:javascript
运行
复制
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,从而消除了一个潜在的错误源。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57412627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档