使用os.system()的Python'源HOME / .bashrc'

时间:2010-09-07 18:35:07

标签: python bash os.system

我正在编写一个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')

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

有什么建议吗?

4 个答案:

答案 0 :(得分:6)

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

另一种允许你做一些接近的方法是用bash函数编写它,它在同一个进程中运行并可以修改调用者。请注意,在运行时期间采购可能会产生负面的副作用,具体取决于用户在其bashrc中的含义。

答案 1 :(得分:3)

你要做的事情是不可能的。或者更好:你是如何做到的那样是不可能的。

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

  2. 为什么要提供.bashrc?仅仅来源.bash_aliases

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

  5. 每当你想在当前的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

答案 2 :(得分:0)

[[工作解决方案]]

http://stackoverflow.com/questions/6856119/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()

答案 3 :(得分:0)

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

我最终在我的函数中使用了这个来从我需要的bash文件中提取相同的变量。一定要导入os。

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