我有一个很长的bash脚本,在最后导出一个环境变量,我们叫它myscript.sh。我需要从python代码中调用这个shell脚本。据我所知,导出的环境变量是本地的,在python中是不可见的。有没有一种合适的方法可以让它在python环境中导出呢?
s8vozzvw1#
你可以在脚本中使用env -0来打印所有的环境变量,用空字符分隔,因为如果换行符包含在某个变量值中可能会有问题。
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
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
["/bin/bash", "-c", ". myscript && echo MYVAR=$myvar"]
2条答案
按热度按时间s8vozzvw1#
你可以在脚本中使用
env -0
来打印所有的环境变量,用空字符分隔,因为如果换行符包含在某个变量值中可能会有问题。bhmjp9jg2#
从子进程获取信息的最简单方法是通过stdout管道,这在python的exec方法中很容易捕获。
让你的脚本以一种易于解析的方式打印你想要的信息。
如果你真的想看到env变量,那么你需要把它们打印出来。如果你不想修改你正在运行的脚本,那么你可以执行脚本,然后转储env,这是可解析的。
或者如果您需要某个特定的env变量:
注意,这将由python的默认shell执行,如果你特别想要bash,或者你想让你的脚本的hashbang得到尊重,那就需要更多的努力,例如,你可以自己抓取hashbang,但是env打印技巧只对shell起作用--hashbang可能指的是其他的小技巧,比如sed/awk
为了避免嵌套shell调用,您可以使用
["/bin/bash", "-c", ". myscript && echo MYVAR=$myvar"]
和shell=False调用subprocess.Popen