我正在编写一个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')
...将冻结脚本(就像等待某事一样)。
有什么建议吗?
答案 0 :(得分:6)
你想要的是不可能的。程序(您的脚本)无法修改调用者的环境(您运行它的shell)。
另一种允许你做一些接近的方法是用bash函数编写它,它在同一个进程中运行并可以修改调用者。请注意,在运行时期间采购可能会产生负面的副作用,具体取决于用户在其bashrc中的含义。
答案 1 :(得分:3)
你要做的事情是不可能的。或者更好:你是如何做到的那样是不可能的。
您的bash命令错误。 bash -s command
未执行command
。它只是将字符串“command”存储在变量$1
中,然后将您转到提示符。这就是python脚本似乎冻结的原因。你打算做的是bash -c command
。
为什么要提供.bashrc
?仅仅来源.bash_aliases
即使你的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
答案 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