如何从python运行shell脚本并使用其导出的环境变量?

0qx6xfy6  于 2023-02-05  发布在  Shell
关注(0)|答案(2)|浏览(185)

我有一个很长的bash脚本,在最后导出一个环境变量,我们叫它myscript.sh。我需要从python代码中调用这个shell脚本。据我所知,导出的环境变量是本地的,在python中是不可见的。
有没有一种合适的方法可以让它在python环境中导出呢?

s8vozzvw

s8vozzvw1#

你可以在脚本中使用env -0来打印所有的环境变量,用空字符分隔,因为如果换行符包含在某个变量值中可能会有问题。

import os
import subprocess

for k,v in filter(lambda p: len(p)==2, map(lambda e:e.decode().split('='), subprocess.run('script', check=True, capture_output=True).stdout.split(b'\x00'))):
    os.environ[k]=v
bhmjp9jg

bhmjp9jg2#

从子进程获取信息的最简单方法是通过stdout管道,这在python的exec方法中很容易捕获。
让你的脚本以一种易于解析的方式打印你想要的信息。
如果你真的想看到env变量,那么你需要把它们打印出来。如果你不想修改你正在运行的脚本,那么你可以执行脚本,然后转储env,这是可解析的。

. myscript && env

或者如果您需要某个特定的env变量:

. myscript && echo MYVAR=$myvar

注意,这将由python的默认shell执行,如果你特别想要bash,或者你想让你的脚本的hashbang得到尊重,那就需要更多的努力,例如,你可以自己抓取hashbang,但是env打印技巧只对shell起作用--hashbang可能指的是其他的小技巧,比如sed/awk
为了避免嵌套shell调用,您可以使用["/bin/bash", "-c", ". myscript && echo MYVAR=$myvar"]和shell=False调用subprocess.Popen

相关问题