Python'source HOME/.bashrc'和os.system()

2024-05-16 15:04:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

…会冻结脚本(就像在等待什么一样)。

有什么建议吗?


Tags: 脚本bashsourcehomebinoslinuxshell
3条回答

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

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

  2. 为什么要寻找.bashrc?光是源代码是不够的吗?

  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

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

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

[[工作解决方案]]

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()

相关问题 更多 >