【问题标题】:Python 'source HOME/.bashrc' with os.system()带有 os.system() 的 Python 'source HOME/.bashrc'
【发布时间】:2010-09-07 18:35:06
【问题描述】:

我正在编写一个 python 脚本 (Linux),它添加了一些 shell aliases(将它们写入 HOME/.bash_aliases)。

为了使别名在编写后立即可用,我应该发出以下内置 bash:

source HOME/.bashrc

source 是内置的 bash,所以我不能只是:

os.system(source HOME/.bashrc)

如果我尝试类似:

os.system('/bin/bash -c source HOME/.bashrc')

...将冻结脚本(就像在等待某事一样)。

有什么建议吗?

【问题讨论】:

    标签: python bash os.system


    【解决方案1】:

    你想要的都是不可能的。程序(你的脚本)不能修改调用者的环境(你运行它的 shell)。

    另一种允许您做一些接近的方法是用 bash 函数编写它,该函数在同一进程中运行并且可以修改调用者。请注意,根据用户在其 bashrc 中的内容,在运行时进行采购可能会产生负面影响。

    【讨论】:

    • 感谢您的反馈。与此同时,我做了一些研究,是的,你是对的,我想要的不太可能。解决方法是编写一个 bash 脚本并在必要时运行它。但我在想,在运行时修改环境可能很危险,尤其是在服务器已经在运行“密集”脚本的情况下。
    • @Andrei 我尝试使用 bash 脚本来做源代码,但也没有用。
    【解决方案2】:

    你想要做的事情是不可能的。或更好:您尝试如何做到这一点是不可能的。

    1. 你的 bash 命令是错误的。 bash -s command 不执行 command。它只是将字符串“command”存储在变量$1 中,然后将您带到提示符处。这就是python脚本似乎冻结的原因。你的意思是bash -c command

    2. 你为什么要使用.bashrc?仅仅来源 .bash_aliases 还不够吗?

    3. 即使你的 bash 命令正确,更改也只会在从 python 启动的 bash 会话中生效。一旦该 bash 会话关闭,并且您的 python 脚本完成,您将回到原来的 bash 会话。从 python 启动的 bash 会话中的所有更改都将丢失。

    每次您想在当前 bash 会话中更改某些内容时,都必须在当前 bash 会话中进行。您从 bash 运行的大多数命令(系统命令、python 脚本,甚至 bash 脚本)都会产生另一个进程,并且您在该进程中所做的一切都不会影响您的第一个 bash 会话。

    source 是一个内置的 bash,它允许您在当前运行的 bash 会话中执行命令,而不是生成另一个进程并在那里运行命令。定义 bash 函数是在当前运行的 bash 会话中执行命令的另一种方式。

    有关采购和执行的更多信息,请参阅this answer

    你可以做些什么来实现你想要的

    修改您的 python 脚本,只对.bash_aliases 进行必要的更改。

    准备一个 bash 脚本来运行你的 python 脚本,然后输入.bash_aliases

    #i am a bash script, but you have to source me, do not execute me.
    modify_bash_aliases.py "$@"
    source ~/.bash_aliases
    

    为您的 .bashrc 添加别名以获取该脚本

    alias add_alias='source modify_bash_aliases.sh'
    

    现在,当您在 bash 提示符中键入 add_alias some_alias 时,它将被替换为 source modify_bash_aliases.sh,然后执行。由于source 是内置的bash,脚本中的命令将在当前运行的bash 会话中执行。 python 脚本仍将在另一个进程中运行,但随后的source 命令将在您当前正在运行的 bash 会话中运行。

    另一种方式

    修改您的 python 脚本,只对.bash_aliases 进行必要的更改。

    准备一个 bash 函数来运行您的 python 脚本,然后获取 .bash_aliases

    add_alias() {
      modify_bash_aliases.py "$@"
      source ~/.bash_aliases      
    }
    

    现在你可以像这样调用函数了:add_alias some_alias

    【讨论】:

      【解决方案3】:

      我遇到了一个有趣的问题,我需要获取一个 RC 文件才能在我的 python 脚本中获得正确的输出。

      我最终在我的函数中使用它来从我需要获取的 bash 文件中引入相同的变量。确保已导入操作系统。

      with open('overcloudrc') as data:
          lines = data.readlines()
      
      for line in lines:
          var = line.split(' ')[1].split('=')[0].strip()
          val = line.split(' ')[1].split('=')[1].strip()
          os.environ[var] = val
      

      【讨论】:

        【解决方案4】:

        Can I use an alias to execute a program from a python script 的工作解决方案:

        import subprocess
        sp = subprocess.Popen(["/bin/bash", "-i", "-c", "nuke -x scriptpath"])
        sp.communicate()
        

        【讨论】:

          猜你喜欢
          • 2019-10-12
          • 1970-01-01
          • 2017-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多