如何从Python脚本中引用bashrc/bashprofile

3

我想知道如何从Python中获取你的bashrc。我自动将脚本转换为别名等。下面是在shell中看到的内容:

In [6]: subprocess.call(['sudo', 'source', '/home/cchilders/.bashrc'])
sudo: source: command not found
Out[6]: 1

In [7]: subprocess.call(['sudo', '.', '/home/cchilders/.bashrc'])
sudo: .: command not found

谢谢您


4
source是bash内置命令,因此您需要执行 bash -c "source ..."。但这样做不会产生您想要的效果,因为当bash进程结束时,shell设置将消失。您需要在启动Python之前执行此操作。 - glenn jackman
如果我从Python中调用一个仅仅在shell脚本中源代码的脚本会怎样? - codyc4321
1
这样做不会达到你想要的效果...在Python shell或脚本中调用rc并不会产生任何影响...你实际上想要实现什么?也许有其他方法可以做到... - Joran Beasley
@codyc4321,记住这一点:子进程不能更改其父进程的环境。 - glenn jackman
你到底想用这个做什么?仅仅在子进程中运行一堆 shell 命令并不会影响 Python 程序的状态(或者任何父进程的状态)。 - David Foerster
4个回答

1

当你使用subprocess.call时,你没有使用shell - 来自: https://docs.python.org/2/library/subprocess.html#subprocess.call

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

subprocess.call的默认环境是没有shell的。Source是bash内置命令,所以subprocess没有要执行的程序。而且在你的bashrc中的大部分代码在subprocess的上下文中都没有意义。

你可能想做的是提供更详细的信息,说明你试图通过source bashrc文件实现什么目标,这可以用更符合Python风格的方式来完成。


0

您可以使用subprocess.run和子shell来实现这一点。

不要使用这个:

subprocess.call(['sudo', 'source', '/home/cchilders/.bashrc'])

试试这个:

subprocess.run("sudo bash -c 'source /home/cchilders/.bashrc'", shell=True)

1
subprocess.run("bash -c 'source ~/.bashrc && {REST_OF_CMD}'") 在其他方法不起作用时对我很有用。 - Maximilian Press

0

sudo source 不起作用,因为 source 是一个 shell 内置命令。我不确定为什么你不能 sudo source,因为 sudo echo 可以正常工作,但是尝试使用 subprocess.call(['.', '/home/cchilders/.bashrc']) 或者相应的等效命令。


3
或者说“type -a source”和“type -a echo”之间的区别在于“sudo echo”是可行的。 - glenn jackman
我认为你可以使用 subprocess.call("source /home/user/.bashrc",shell=True) ... 但正如在 OP 的评论中提到的那样,即使他设法让它工作,也不会产生预期的效果。 - Joran Beasley

0

请尝试以下方法:

import os

os.system("source /home/cchilders/.bashrc")

如果你想调用任何工具或运行其他脚本:

os.system("source /home/cchilders/.bashrc && python3 script name")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接