我正在运行4个Python脚本,简而言之,这些脚本应该设置环境变量。
point是使用os.environ['TEST']
(例如)将其设置为仅在运行它的Python脚本的范围内。
$ python test.py arg1
$ echo $TEST < ------------
这将返回空白。而从Python脚本中进行打印会在TEST中显示一个值
os.environ.get('TEST')
如何从python脚本设置环境变量?
作为另一种解决方法,(另一个问题)一个人如何在Python脚本之间共享数据?
答案 0 :(得分:4)
您似乎对流程和环境的工作方式有完全的误解。
$ python test.py arg1
$ echo $TEST
第一行将创建一个 new 进程,它是与Shell本身完全独立的进程。尽管环境变量的值可能是从父流程的环境继承的,但是新流程具有自己的环境。
到第二行执行时,第一行的过程和环境甚至不复存在!您无法在Python进程中轻松修改Shell进程的环境。
作为另一种解决方法,(另一个问题)一个人如何在python脚本之间共享数据?
不通过环境-在Python进程完成后,即退出脚本时,其环境已被破坏。 “替代问题”也许太笼统了,因为有许多方法可以在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