Python 在子流程中使用$variables

Python 在子流程中使用$variables,python,python-3.x,subprocess,Python,Python 3.x,Subprocess,我正在构建一个工具,该工具在一定程度上充当yaml的预处理器,它应该具有shell命令插值,以便在解析所述yaml时获取外部信息 我构建它的方法是找到封装在$eval(…)中的shell命令,并使用子流程。检查输出以获取此类命令的返回 我不知道如何在check_out中使用$variables,例如,export foo=bar,子流程。check_output([“echo”,“$foo”])应返回b'bar'。而是返回文本b'$foo' 有没有办法告诉check\u output正确解析这些

我正在构建一个工具,该工具在一定程度上充当yaml的预处理器,它应该具有shell命令插值,以便在解析所述yaml时获取外部信息

我构建它的方法是找到封装在
$eval(…)
中的shell命令,并使用
子流程。检查输出以获取此类命令的返回

我不知道如何在check_out中使用$variables,例如,
export foo=bar
子流程。check_output([“echo”,“$foo”])
应返回
b'bar'
。而是返回文本
b'$foo'


有没有办法告诉
check\u output
正确解析这些$variables?

如果
foo
是您环境中的一个变量,您可以将该值直接包含在列表中,而不是作为要展开的shell参数

check_output(["echo", os.environ["foo"]])

当您在shell中运行
echo$foo
时,该shell负责将
$foo
替换为多个独立的参数,这些参数应该通过字符串拆分和全局扩展来实现,并根据相关变量的实际值停止。这些步骤在
echo
启动之前就已经完成了……因此,当您在没有shell的情况下调用
echo
时,您不能期望
$foo
被其他任何东西替换;它仍然是
$foo
,因为您没有运行shell,而shell是唯一执行该操作的东西。(另外,您得到的是
/bin/echo
而不是shell的内部
echo
内置实现,因此其他行为可能会有细微的不同;请参阅应用程序用法和基本原理部分,其中描述了如何松散地定义
echo
的行为)…这个故事的寓意是:如果您想要一个shell,实际上需要运行一个shell,通过使用
shell=True
并将希望该shell解析为代码的整个字符串作为单个字符串传递。(如果您传递一个带有
shell=True
的列表,列表中的第一个元素就是它解析为代码的内容,后续元素是该代码的参数——也就是说,它的
$0
$1
等等)。对。有很好的理由不使用您可能不信任作为代码传递的数据来运行shell,但您试图构建的东西的本质是,如果您不信任输入以任何用户的身份运行任意命令,那么该工具将完全不可用。顺便说一句,
shell=True
不是魔术;它只是用一个单独的项目列表替换你的参数,如果它是一个字符串,则将其封装,然后在列表前面加上前缀
['sh','-c']
。您可以运行
子流程。检查_输出([“sh”、“-c”、“echo$foo”])
而不使用
shell=True
作为
子流程的替代。检查_输出(“echo$foo”,shell=True)
和行为将是100%不可区分的。上下文,因为这不是OP的第一个问题:他们想要任意shell命令的输出。到目前为止,他们为什么不愿意调用shell来获得这个结果还是个谜。