【问题标题】:how to set environmental variables permanently in posix(unix/linux) machine using python script如何使用 python 脚本在 posix(unix/linux) 机器中永久设置环境变量
【发布时间】:2015-01-23 11:50:58
【问题描述】:

我正在尝试永久设置环境变量。但暂时它正在工作。

如果我在程序下面运行,我得到了变量路径。关闭它并使用命令printenv LD_LIBRARY_PATH 打开新终端以查找变量路径后,什么都不会打印。

#!/usr/bin/python


import os
import subprocess

def setenv_var():
    env_var = "LD_LIBRARY_PATH"
    env_path = "/usr/local/lib"`enter code here`
    os.environ[env_var] = env_path
    process = subprocess.Popen('printenv ' + env_var, stdout=subprocess.PIPE, shell=True)
    result = process.communicate()[0]
    return result

if __name__ == '__main__':
    print setenv_var()

请帮助我。

【问题讨论】:

  • 这是一个 similar question 和一个 negative answer:你不能从子进程中这样做
  • 这通常是不可能的,无论是从 python 还是从任何其他进程:stackoverflow.com/a/496777/2954288。考虑到您提出问题的方式,一种方法是让您的 python 程序操作您的 ~/.bashrc 或 ~/.profile ,下次启动 shell 时,它会很好地读取新的环境设置。

标签: python linux unix environment-variables


【解决方案1】:

这里是我用来设置环境变量的:

def setenv_var(env_file, set_this_env=True):
    env_var = "LD_LIBRARY_PATH"
    env_path = "/usr/local/lib"`enter code here`
    # set environments opened later by appending to `source`-d file
    with open(env_file, 'a') as f:
        f.write(os.linesep + ("%s=%s" % (env_var, env_path)))
    if set_this_end:
        # set this environment
        os.environ[env_var] = env_path

现在您只需要选择设置它的位置,即函数中的第一个参数。我推荐配置文件特定的文件~/.profile 或者如果你使用的是很常见的 bash ~/.bashrc

您也可以使用/etc/environment 之类的文件进行全局设置,但在运行此脚本时需要获得权限 (sudo python script.py)。

请记住,环境是从父进程继承的,您不能让子进程设置父进程的环境。

【讨论】:

    【解决方案2】:

    当您设置环境变量时,它只会影响当前正在运行的进程(并且,通过扩展,设置变量后派生的任何子进程)。如果您尝试在 shell 中设置环境变量并且希望始终为交互式 shell 设置该环境变量,则需要在 shell 的启动脚本(例如 .login、.bashrc、.profile)中设置它.您运行的命令(最初)是运行它们的 shell 的子级,因此尽管它们继承了 shell 的环境并且可以更改自己的环境,但它们不能更改 shell 的环境。

    【讨论】:

      【解决方案3】:

      无论您是从 bash 执行 export 还是从 Python 设置 os.environ,这些都只会在会话或进程的生命周期内保留。如果您想将它们设置为永久,您必须触摸并将其添加到相应 shell 的配置文件中。

      例如。如果你使用 bash,你可以这样做:

      with open("~/.bashrc", "a") as outfile: # 'a' stands for "append"
           outfile.write("export LD_LIBRARY_PATH=/usr/local/lib")
      

      查看此内容以了解根据目标 shell 添加哪个文件。 https://unix.stackexchange.com/questions/117467/how-to-permanently-set-environmental-variables

      【讨论】:

      • 如果我尝试打开 ~/.basher,我会收到错误,例如找不到文件或目录。但是 .bashrc 正在工作。
      猜你喜欢
      • 2022-01-17
      • 2019-11-04
      • 2021-07-16
      • 2019-07-18
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多