【问题标题】:Edit enviroment variables inside python for script bash在 python 中为脚本 bash 编辑环境变量
【发布时间】:2019-08-09 19:40:39
【问题描述】:

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

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' 是空的。你有什么建议吗?

【问题讨论】:

  • @Adii 的回答指出这是不可能的。环境变量不是全局的。它们对每个进程都是私有的。当一个进程启动另一个进程时,它可以将当前的环境变量传递给新进程,也可以为其提供一组自定义变量。但是该新进程无法修改其父进程的环境变量。更一般地说,没有进程可以修改另一个进程的环境变量。

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


【解决方案1】:

你不能从 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

在 python 外部调用 bash 脚本,参数如 myscript.sh 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')

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2017-10-26
    • 1970-01-01
    • 2016-10-07
    • 2017-02-03
    • 1970-01-01
    相关资源
    最近更新 更多