代码之家  ›  专栏  ›  技术社区  ›  Amin Ba

如何使子shell env变量在主shell python控制台中可用?

  •  0
  • Amin Ba  · 技术社区  · 7 月前

    我打开一个python控制台并运行

    >>> import os
    >>> os.system("export aaa=123")
    >>> os.environ["aaa"]
    

    我看到一个关键错误。为什么? 如何在整个过程中保留env变量?

    4 回复  |  直到 7 月前
        1
  •  2
  •   VoNWooDSoN    7 月前

    一般来说,子shell不能直接共享或修改父shell中的环境变量。 When a child process is created, it receives a copy of the parent’s environment variables, but any changes made in the child process do not affect the parent process.

    你有没有考虑过 为什么? 你想这样做吗?我不希望我的子进程可以修改我的环境变量。。。这是一个“代码气味”问题。

    考虑一下,如果您需要在python脚本中的不同子进程之间传递值,请使用 the multiprocessing module 尤其是 the multiprocessing.Queue class

    这提供了一种在运行的python进程之间传递数据的python方式,减轻了滚动自己的消息队列的许多麻烦,甚至不得不安装/使用像Kafka这样的企业级工具。

    如果这不符合你的喜好,那么我建议你在文件系统上维护一个文件,其中包含你需要在进程之间传递的神奇值。

    tl;博士;这里是:如果你能成功,那就是 仍然 可能不是正确的做法。

        2
  •  2
  •   steffen    7 月前

    os.system() 创建一个子shell。子shell无法访问其父环境(已复制)。他们无法修改它。您可以更改您的 现在的 环境(不是子层),并让子层继承它:

    >>> import os
    >>> os.environ['abc'] = '123'
    >>> os.system('echo $abc')
    123
    
        3
  •  0
  •   Ron    7 月前

    在Python进程中设置环境变量

    os.environ['aaa'] = "123"

    现在或稍后,您可以将其作为普通环境变量访问

    print(os.environ['aaa'])

        4
  •  0
  •   Amadan    7 月前

    正如其他人所说,亚壳层不能影响超壳层的环境。但如果允许超级地狱合作,并非一切都会失去。

    大多数需要更改超级shell环境的程序的工作方式是,它们打印变量定义,并期望它们在超级shell中执行。对于一个著名的例子, ssh-agent 应该这样使用:

    $ eval `ssh-agent`
    

    ssh代理 输出类似

    SSH_AUTH_SOCK=/tmp/ssh-XXXXXXkZD1hM/agent.200830; export SSH_AUTH_SOCK;
    SSH_AGENT_PID=200831; export SSH_AGENT_PID;
    echo Agent pid 200831;
    

    当你应用内置的shell时 eval 对于它,变量在当前shell中定义。你可以为自己申请类似的东西:

    import os
    import subprocess
    
    output = subprocess.check_output(
        "echo aaa=123; echo bbb=456",
        shell=True, encoding='utf-8',
    )
    vars = { k: v for k, v in [row.split('=', 1) for row in output.splitlines()] }
    os.environ.update(vars)
    
    print(os.environ["aaa"])
    # => 123
    print(os.environ["bbb"])
    # => 456
    

    请注意,这是根据您描述的场景量身定制的:将变量从子shell传递到 os.environ 调用Python程序。正如VonWooDSoN正确指出的那样,在两个Python进程之间还有其他通信方式(例如。 multiprocessing ),以及异构进程之间(例如Redis)。