【问题标题】:how to source bashrc/bashprofile from python script如何从 python 脚本中获取 bashrc/bashprofile
【发布时间】:2016-03-16 18:27:09
【问题描述】:

我想知道如何从 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

谢谢

【问题讨论】:

  • source 是内置的 bash,因此您必须使用 bash -c "source ..."。但是,这不会产生您正在寻找的效果,因为当 bash 进程结束时,shell 设置将会消失。 在启动python之前你需要这样做。
  • 如果我调用一个仅来自 python 内部的 shell 脚本会怎样
  • 这不会做你想要的......没有办法调用rc并让它在python shell或脚本中产生任何影响......你实际上想要完成什么?也许还有其他方法可以做到...
  • @codyc4321,记住这一点:子进程不能改变其父进程的环境。
  • 您到底想达到什么目的?只是在子进程中运行一堆 shell 命令不会影响 Python 程序(或任何父进程)的状态。

标签: python bash scripting subprocess .bash-profile


【解决方案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 的默认设置是 no environment,因为您不在 shell 中。 Source 是内置的 bash,因此没有子进程可以执行的程序。在子进程的上下文中调用 bashrc 中的大部分代码可能毫无意义。

您可能想要做的是提供更详细的信息,说明您通过采购 bashrc 文件来尝试完成的工作,该文件可以以更 Python 的方式完成。

【讨论】:

    【解决方案2】:

    sudo source 不起作用,因为 source 是内置的 shell。我不确定您不能 sudo source 的技术原因,因为 sudo echo 工作得很好,但请尝试使用 subprocess.call(['.', '/home/cchilders/.bashrc']) 或任何等价物。

    【讨论】:

    • type -a sourcetype -a echo——这就是“sudo echo”有效的原因
    • 我认为你可以这样做 subprocess.call("source /home/user/.bashrc",shell=True) ... 但正如 OP 的 cmets 中所述,即使他设法使其发挥作用,也不会产生预期的效果
    【解决方案3】:

    尝试以下方法:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      相关资源
      最近更新 更多