从python脚本设置bash环境变量

时间:2018-10-24 04:59:14

标签: python bash environment-variables

我正在运行4个Python脚本,简而言之,这些脚本应该设置环境变量。

point是使用os.environ['TEST'](例如)将其设置为仅在运行它的Python脚本的范围内。

$ python test.py arg1
$ echo $TEST    < ------------

这将返回空白。而从Python脚本中进行打印会在TEST中显示一个值

os.environ.get('TEST')

如何从python脚本设置环境变量?

作为另一种解决方法,(另一个问题)一个人如何在Python脚本之间共享数据?

4 个答案:

答案 0 :(得分:4)

您似乎对流程和环境的工作方式有完全的误解。

$ python test.py arg1
$ echo $TEST

第一行将创建一个 new 进程,它是与Shell本身完全独立的进程。尽管环境变量的值可能是从父流程的环境继承的,但是新流程具有自己的环境。

到第二行执行时,第一行的过程和环境甚至不复存在!您无法在Python进程中轻松修改Shell进程的环境。

  

作为另一种解决方法,(另一个问题)一个人如何在python脚本之间共享数据?

不通过环境-在Py​​thon进程完成后,即退出脚本时,其环境已被破坏。 “替代问题”也许太笼统了,因为有许多方法可以在Python进程之间共享数据,但是我建议您首先从文件中读取/写入数据。

答案 1 :(得分:4)

不可能为父(或祖先)流程环境设置环境变量。

某些bash脚本通过使用source执行(在当前bash中运行它们,而不是生成bash进程)来满足此要求,但是显然,这永远不会与python脚本一起使用在不生成python子进程的情况下,无法在bash进程内部执行python脚本。

某些其他程序(例如ssh-agent)将必需的分配输出到标准输出,以使它们的输出可以通过bash中的eval运行;尽管需要呼叫者的配合(例如,运行eval $(ssh-agent)而不是仅仅运行ssh-agent),此方法仍然有效。

关于您的子问题-有多种方法可以在进程之间共享数据:命令行参数,管道,命名管道,文件,套接字,信号,数据库(SQL和非SQL),其他服务(Web和SQL)否则)...如果您要求我们选择最合适的方案,则需要详细说明您的方案。但这真的是一个新问题。

答案 2 :(得分:1)

环境块是每个进程唯一的内存区域。内容由启动过程的方式确定。默认情况下,父进程的环境块被复制到子进程。孩子可以随意更改自己的环境块,但不能更改其父母的环境。

最重要的是,环境值只能沿一个方向传递,即从父级到子级。

这适用于所有进程,无论使用哪种语言编写程序。

“使用os.environ ['TEST'](例如)仅针对运行它的Python脚本设置它。” -正确

“如何从python脚本中设置环境变量?” -理论上,可能必须用C编写的调试器可以附加到进程并更改内存块。这是困难的,危险的(可能会覆盖错误的内存),巨大的安全风险和维护噩梦。你真的不想去那里。

在进程之间共享数据是一个广泛的问题,使用哪种语言并不重要-原理是相同的。

这取决于数据的类型(二进制或文本),数据量(几个字节或兆字节),如果数据是双向传输的(可能需要同步),如果数据必须是持久的(可能需要文件或数据库),可能还有一百万我没有想到的其他东西。

您需要更具体地说明在什么情况下共享哪些数据,包括由谁进行写作和由谁进行阅读。

答案 3 :(得分:-1)

您可以使用Python程序更新〜/ .bashrc 〜/ .bash_profile 文件,但仍需要 source 文件,然后再使用 echo 这样的说明。

python test.py arg1 // Update your ~/.bash_profile file
source ~/.bash_profile
echo $TEST