在python内部编辑脚本bash的环境变量

时间:2019-08-09 10:27:08

标签: bash python-2.7 mapreduce environment-variables mrjob

我的项目使用没有hadoop的mapreduce,它由两个文件组成:

  

bash.sh和mapreduce.py。

我想使用环境变量在bash.sh和mapreduce.py之间传递信息。 在bash.sh中,我使用export myvariable,在mapreduce.py中,我使用os.environ ['myvariable']

我想在mapreduce.py中编辑myvariable并通过bash.sh打印结果。我试图执行以下指令:os.environ ['myvariable'] = 'hello',但是在bash.sh上,“ myvariable”为空。你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

  

您无法通过python做到这一点,但是一些聪明的bash技巧可以做到   相似的东西。基本理由是:环境变量   存在于每个进程的内存空间中。创建新流程时   使用fork()继承其父级的环境变量。当你   像这样在您的shell(例如bash)中设置环境变量:

/why-cant-environmental-variables-set-in-python-persist

因此,只有在python进程空间内调用bash脚本时,您才可以使用Bash脚本。一个简单的例子可以是

bash脚本

#!/bin/bash
echo "var from python is $myvariable"

python脚本

import os
os.environ ['myvariable'] = 'hello'
print(os.environ['myvariable'])
# all environment varaibles will be availbe to bash script in this case
os.system('sh ./ab.sh')

这是您可以尝试的方法。否则,无法设置它并使它可用于bash脚本。

  

设置环境变量仅将其设置为当前进程   以及它启动的所有子进程。所以使用os.system可以设置它   仅针对正在运行以执行命令的shell   提供。该命令完成后,shell消失了,所以也消失了   环境变量。使用os.putenv或os.environ进行设置   类似的效果;为Python设置了环境变量   过程及其任何子项。

ENV via python

您也可以尝试反过来说,

这是序列

  • 首先在bash脚本中设置
  • 从bash调用python脚本(基于避免循环的参数)
  • 在python中更新ENV
  • 再次从python调用bash,如果在外部调用它将消失。

bash脚本

#!/bin/bash
export myvariable="hellobash"
echo "myvariable form bash $myvariable"
if [ ! -z $1 ]; then 
./py.py
else
echo "myvariable after updated from python $myvariable"
fi

使用类似myscript.sh bash的参数从python外部调用bash脚本,而在python myscript.sh中不使用参数

#!/usr/bin/python
import os
print("myvar form python",os.environ['myvariable'])
os.environ ['myvariable'] = 'hello'
print("myvar form python after update",os.environ['myvariable'])
os.system('sh ./ab.sh')

enter image description here