【问题标题】:How to run shell script from python and use its exported environment variables?如何从 python 运行 shell 脚本并使用其导出的环境变量?
【发布时间】:2023-02-04 04:19:27
【问题描述】:

我有一个很长的 bash 脚本,最后导出一个环境变量,我们称之为myscript.sh. 我需要从 python 代码调用这个 shell 脚本。据我所知,导出的环境变量将是本地的,在 python 中是不可见的。

是否有适当的方法使其也可以在 python 环境中导出?

【问题讨论】:

  • 您可以在 shell 脚本末尾运行 env 命令。我看不出有其他方法可以做到这一点。环境变量被传递给子进程,但是您的 Python 脚本是 bash 脚本的父进程,并且环境变量不会从子进程流向父进程。
  • 所以换句话说,运行你的 shell 脚本,然后你的 Python 脚本。或者,用 Python 重新实现 shell 的所有(或至少主要部分)。或者,如果可以的话,用一些东西改变或包装 shell 脚本,将其结果变成你可以在 Python 中使用 execast.literal_eval 的东西。
  • 绝望的方法是source ./myscript.sh && python ./otherscript.py,但我不会亲自这样做,除非我将该行放在我的 .bashrc 或 .profile 或诸如此类的东西中。
  • myscript.sh 的末尾,将myvar=some value 写入一个临时文件并在 python 中读取该临时文件。接下来 Python 可以设置变量。

标签: python bash shell sh


【解决方案1】:

从子进程获取任何信息的一般最简单方法是通过 stdout 管道,这很容易在 python exec 方法中捕获。

让您的脚本以易于解析的方式打印您想要的信息。

如果您真的想查看环境变量,则需要将它们打印出来。如果您不想修改您尝试运行的脚本,那么您可以执行该脚本,然后转储可解析的环境。

. myscript && env

或者如果您想要一个特定的环境变量:

. myscript && echo MYVAR=$myvar

请注意,这将由 python 的默认 shell 执行。如果你特别想要 bash,或者你想要你的脚本的 hashbang 得到尊重,那就需要更多的努力。例如,您可以自己抓取 hashbang,但是 env 打印技巧仅适用于 shell——hashbang 可能指的是其他技巧,例如 sed/awk

为避免嵌套 shell 调用,您可以调用 subprocess.Popen,例如 ["/bin/bash", "-c", ". myscript && echo MYVAR=$myvar"] 和 shell=False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    相关资源
    最近更新 更多