是否有可能在 Python 中改变父进程的环境?
- 2024-10-09 09:11:00
- admin 原创
- 81
问题描述:
在 Linux 中,当我从 shell 调用 python 时,它会复制其环境并启动 python 进程。因此,如果我执行以下操作:
import os
os.environ["FOO"] = "A_Value"
当 python 进程返回时,FOO(假设它最初未定义)仍将未定义。python 进程(或任何子进程)是否有办法修改其父进程的环境?
我知道你通常使用类似的东西来解决这个问题
source script_name.sh
但这与我的其他要求相冲突。
解决方案 1:
任何进程都不能改变其父进程(或任何其他现有进程的环境)。
但是,您可以通过使用修改后的环境创建新的交互式 shell 来创建新的环境。
您必须生成一个使用升级环境的新 shell 副本并可以访问现有的 stdin、stdout 和 stderr,并执行重新初始化操作。
您需要做一些事情,例如使用 subprocess.Popen 来运行/bin/bash -i
。
因此,原始 shell 运行 Python,而 Python 又运行新 shell。是的,您有很多进程在运行。不,情况还不算太糟,因为原始 shell 和 Python 实际上没有做任何事情,只是等待子 shell 完成,以便它们也可以干净地退出。
解决方案 2:
对于任何子进程来说,都不可能改变父进程的环境。您能做的最好的事情就是将 shell 语句输出到 stdout,然后将其作为源,或者将其写入您在父进程中作为源的文件中。
解决方案 3:
我将使用 bash eval 语句,并让 python 脚本输出 shell 代码
child.py:
#!/usr/bin/env python
print 'FOO="A_Value"'
家长手册
#!/bin/bash
eval `./child.py`
解决方案 4:
我需要类似的东西,最后我创建了一个脚本envtest.py
:
import sys, os
sys.stdout = open(os.devnull, 'w')
# Python code with any number of prints (to stdout).
print("This is some other logic, which shouldn't pollute stdout.")
sys.stdout = sys.__stdout__
print("SomeValue")
然后在 bash 中:
export MYVAR=$(python3 envtest.py)
echo "MYVAR is $MYVAR"
这与预期相呼应:MYVAR is SomeValue
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD