【问题标题】:Is it possible to change the Environment of a parent process in Python?是否可以在 Python 中更改父进程的环境?
【发布时间】:2008-11-04 19:08:16
【问题描述】:

在 Linux 中,当我从 shell 调用 python 时,它会复制其环境,并启动 python 进程。因此,如果我执行以下操作:

import os
os.environ["FOO"] = "A_Value"

当python进程返回时,FOO,假设它最初是未定义的,仍然是未定义的。 python进程(或任何子进程)有没有办法修改其父进程的环境?

我知道你通常使用类似的方法来解决这个问题

source script_name.sh

但这与我的其他要求相冲突。

【问题讨论】:

  • 该线程中的 Andrew 回答:通过 gdb: (gdb) attach process_id (gdb) call putenv ("env_var_name=env_var_value") (gdb) detach 这是一个非常讨厌的 hack,只能在当然是调试场景的上下文。

标签: python linux environment


【解决方案1】:

任何进程都不能更改其父进程(或任何其他现有进程的环境)。

但是,您可以通过使用修改后的环境创建新的交互式外壳来创建新环境。

您必须生成一个新的 shell 副本,该副本使用升级后的环境并可以访问现有的标准输入、标准输出和标准错误,并进行重新初始化。

你需要做一些事情,比如使用 subprocess.Popen 来运行/bin/bash -i

所以原来的 shell 运行 Python,它运行一个新的 shell。是的,您有很多进程正在运行。不,这并不算太糟糕,因为原始的 shell 和 Python 并没有真正做任何事情,只是等待子 shell 完成,这样它们也可以干净地退出。

【讨论】:

  • 是的,这就是我目前正在做的事情。我试图避免重新初始化的舞蹈。
  • 我编辑了你的帖子,修正了一些小错字,并添加了一个带括号的评论(如果你不同意,你可能想删除它)
  • 改变一个“现有的”过程——虽然是真的——是相切的。改变父进程让每个人都感到困惑;人们不清楚所有 *nix 命令都在子进程中运行。
【解决方案2】:

任何子进程都不可能改变父进程的环境。您可以做的最好的事情是将 shell 语句输出到标准输出,然后将其写入源文件,或者将其写入您在父文件中获取的文件。

【讨论】:

    【解决方案3】:

    我会使用 bash eval 语句,并让 python 脚本输出 shell 代码

    child.py:

    #!/usr/bin/env python
    print 'FOO="A_Value"'
    

    parent.sh

    #!/bin/bash
    eval `./child.py`
    

    【讨论】:

    • 这在大多数情况下都有效,但如果 bash 脚本调用 bash 脚本则不行。如果没有,请将print ''FOO="A_Value"' 更改为print 'export FOO="A_Value"'
    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    相关资源
    最近更新 更多