代码之家  ›  专栏  ›  技术社区  ›  Andrei Ciobanu

python'source home/.bashrc'和os.system()。

  •  8
  • Andrei Ciobanu  · 技术社区  · 14 年前

    我正在编写一个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 回复  |  直到 7 年前
        1
  •  6
  •   Daenyth    14 年前

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

    另一种可以让你做一些接近的事情的方法是用bash函数编写它,这个函数在同一个进程中运行,并且可以修改调用者。请注意,运行时寻源可能会产生负面影响,这取决于用户在其bashrc中拥有什么。

        2
  •  3
  •   Community CDub    8 年前

    你想做的事是不可能的。或者更好:你想怎么做是不可能的。

    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脚本,只需对 BasHyAL酶 .

    准备一个bash脚本来运行python脚本,然后源代码 BasHyAL酶 .

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

    为您的 BASHC 以获取该脚本

    alias add_alias='source modify_bash_aliases.sh'
    

    当你打字的时候 add_alias some_alias 在bash提示中,它将被替换为 source modify_bash_aliases.sh 然后执行。自从 来源 是bash内置的,脚本中的命令将在当前运行的bash会话中执行。python脚本仍将在另一个进程中运行,但是 来源 命令将在当前运行的bash会话中运行。

    另一种方式

    修改python脚本,只需对 BasHyAL酶 .

    准备一个bash函数来运行python脚本,然后是source BasHyAL酶 .

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

    现在可以这样调用函数: 添加别名

        3
  •  0
  •   Cereal_Killer    11 年前

    【工作方案】

    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()
    
        4
  •  0
  •   Jim Bagwell    7 年前

    我有一个有趣的问题,我需要源代码一个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