【问题标题】:subprocess.check_output not respecting environment variablessubprocess.check_output 不尊重环境变量
【发布时间】:2019-07-12 22:11:43
【问题描述】:

在使用 Pythons subprocess 模块时,我注意到环境变量似乎没有正确设置。以下是 IPython 会话中的示例:

In [21]: subprocess.check_output(["echo", "$DUMMY"], env={"DUMMY" : "321"}, shell=True)
Out[21]: b'\n'

In [22]: subprocess.check_output(["echo", "$DUMMY"], env={"DUMMY" : "321"})
Out[22]: b'$DUMMY\n'

我知道第二个不起作用,因为它不是由 shell 运行的。但第一个是回显未设置的变量时得到的结果。那么为什么这不起作用呢?或者更可能,我做错了什么?

【问题讨论】:

  • 我回滚了你的编辑——你的问题应该严格来说是一个问题。
  • @tripleee 当然,这行得通。当您的答案不包含完整的代码解决方案时,我添加它是为了完整性。我同意它最好像现在一样放在您的答案中。
  • echo $DUMMY 替换为env。您会看到 env var 实际上已设置。提示:像/bin/echo 这样的任意命令会执行 var 扩展(例如,$DUMMY => 321)还是由特定程序负责?

标签: python subprocess environment-variables


【解决方案1】:

变量插值是一个shell特性;如果没有外壳,您尝试echo 的字符串实际上就是$DUMMY

您可以添加shell=True,然后当然将第一个参数更改为字符串而不是列表;

subprocess.check_call('echo "$DUMMY"', env={"DUMMY": "321"}, shell=True)

...或者想办法直接从 Python 传递列表中的第二个参数。

echo 更好的测试用例是env;然后你可以看到它确实像你要求的那样设置了变量。

【讨论】:

  • 啊哈,所以当使用shell=True 时,我应该将命令作为字符串而不是列表。不知道,当我解决这个问题时有效。知道这对我来说一定很愚蠢,但无法弄清楚。谢谢!
  • 我一直在与这种困惑作斗争。谢谢你。例如,有没有办法加载 bashrc 文件的内容?
  • @BND 当然有,但你真的想避免这种情况。围绕这个主题有几个重复; stackoverflow.com/questions/27553576/… 展示了一种方法,但您可能想知道为什么这实际上是一个坏主意。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多