![](/img/trans.png)
[英]How to get the environment variable set by a bash script from inside a python script?
[英]Set bash environment variable from python script
我正在运行4个Python脚本,简而言之,这些脚本应该设置环境变量。
重点是,使用os.environ['TEST']
(例如)仅针对运行它的Python脚本的范围设置它。
$ python test.py arg1
$ echo $TEST < ------------
这将返回空白。 而从Python脚本中进行打印会在TEST中显示一个值
os.environ.get('TEST')
如何从python脚本设置环境变量?
作为另一种解决方法,(另一个问题)一个人如何在Python脚本之间共享数据?
您似乎对流程和环境的工作方式有完全的误解。
$ python test.py arg1
$ echo $TEST
第一行将创建一个新进程,它是与Shell本身完全独立的进程。 尽管环境变量的值可能是从父流程的环境继承的,但是新流程具有自己的环境。
到第二行执行时,第一行的过程和环境甚至不复存在! 您无法从Python进程中轻松修改Shell进程的环境。
作为另一种解决方法,(另一个问题)一个人如何在python脚本之间共享数据?
不通过环境-Python进程完成后,即退出脚本时,其环境已被破坏。 “替代问题”也许太笼统了,因为有许多方法可以在Python进程之间共享数据,但是我建议您首先从文件中读取/写入数据。
不能为父(或祖先)流程环境设置环境变量。
一些bash脚本通过执行source
来解决此要求(它在当前bash中运行它们,而不是生成bash进程),但是显然这永远不会与python脚本一起使用,因为您无法执行python脚本在bash进程本身内部,而不会产生python子进程。
其他一些程序(例如ssh-agent
)将必需的分配输出到标准输出,以使它们的输出可以通过bash中的eval
运行; 尽管需要调用者的配合(例如,运行eval $(ssh-agent)
而不只是ssh-agent
),但此方法有效。
关于您的子问题-有多种在进程之间共享数据的方法:命令行参数,管道,命名管道,文件,套接字,信号,数据库(SQL和no-SQL),其他服务(Web或其他)。 ..如果您要求我们选择最合适的方案,则需要详细说明您的方案。 但这真的是一个新问题。
环境块是每个进程唯一的内存区域。 内容由启动过程的方式确定。 默认情况下,父进程的环境块被复制到子进程。 孩子可以自由更改自己的环境块,但不能更改其父母的环境。
最重要的是,环境值只能沿一个方向传递,即从父级到子级。
这适用于所有进程,无论使用何种语言编写程序。
“使用os.environ ['TEST'](例如)仅针对运行它的Python脚本的范围设置它。” -正确
“如何从python脚本中设置环境变量?” -理论上,可能必须用C编写的调试器可以附加到进程并更改内存块。 这是困难的,危险的(可能会覆盖错误的内存),巨大的安全风险和维护噩梦。 你真的不想去那里。
在流程之间共享数据是一个广泛的问题,使用哪种语言并不重要-原理是相同的。
它取决于数据的类型(二进制或文本),数据量(几个字节或兆字节),数据是否双向传输(可能需要同步),数据是否必须持久(文件)。或可能需要数据库),可能还有一百万我没有想到的其他事情。
您需要更具体地说明在什么情况下共享哪些数据,包括由谁进行写作和由谁进行阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.