【问题标题】:Python exporting variable in subprocess script and using it in the python script [duplicate]Python在子进程脚本中导出变量并在python脚本中使用它[重复]
【发布时间】:2020-07-29 13:36:01
【问题描述】:

我有一个包含以下内容的 shell 脚本

$cat sample.sh
export greet="hello"
echo $greet

我有一个 python 脚本,我想在其中调用 bash 脚本并使用导出的环境变量。

$cat try.py
import os
os.system(". /tmp/sample.sh")
print("Greet from python : "+os.environ['greet'])

上面的脚本没有检索环境变量“greet”。也尝试使用子进程,但 env 变量在 python 中不可用。看起来它的外壳上下文相关。 https://www.shell-tips.com/bash/source-dot-command/ 有什么想法吗?

【问题讨论】:

  • 只有父 shell 可以将变量导出到其子 shell,反之则不行。这里的 Python 是父级,为执行. /tmp/sample.sh 而创建的 shell 是子级。
  • @NullPointer :您必须以某种方式将环境变量的值传递给调用者。如果 stdout (作为建议的答案之一)不是一个选项,因为您需要 stdout 用于不同的目的,请将其写入文件并从 Python 读取该文件。为了使您的 shell 脚本更灵活地使用,您可以将文件名传递给它。顺便说一句,在您执行此操作时获取脚本(使用 .)在您的设置中没有意义,因为父级不是 bash。

标签: python bash shell subprocess


【解决方案1】:

原因是您错误地使用了环境,但您以一种微妙的方式做到了。

环境仅对子进程共享,os.system() 执行(在子进程中)一个新进程,该进程将获得greet。不幸的是,孩子们将退出并在命令结束时被销毁。 所以在下一行中,您只有原始环境,它不受sample.sh 的影响。

这是一个非常好的安全措施(子进程不会修改父进程的环境)。如果你想传递数据,你应该在 shell 中使用stdout,例如使用子流程(您可以在 Python 库文档中获得示例。

【讨论】:

  • "Subtle" 因为. command 用于保存环境变量“在父级”(这不是真正的父级,它只是在相同的环境中执行,而不是常见的“在子级” ”)。但是这种情况下os.system执行shell,shell执行sample.sh,所以还是在两个不同的环境中
  • 我喜欢反对票,无需解释。 (我在第一条评论前 13 秒给出了答案,所以它不是抄袭),并且重复是错误的。 “解决方案”提出了一个不同的(通常无法使用的解决方法:从 shell 调用 Python 的其余部分:有人喜欢为简单问题提供复杂的解决方案)。
猜你喜欢
  • 2015-07-16
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2013-06-18
  • 2022-10-18
  • 1970-01-01
  • 2016-03-23
相关资源
最近更新 更多