【问题标题】:Load environment variables of bashrc into python将bashrc的环境变量加载到python中
【发布时间】:2023-03-05 02:12:02
【问题描述】:

我正在尝试使用 Spyder 设置我的 .bashrc 的环境变量;换句话说,我正在寻找一个读取我的.bashrc 的python 命令。有什么想法吗?

【问题讨论】:

  • .bashrc 只是一个文件,您可以使用标准调用读取/写入它...
  • 你的意思是在bashrc中加一行,在父进程的环境中设置环境变量,还是在自己进程的环境中设置环境变量?
  • 如果要读取环境变量,只需使用os.environ即可。

标签: python bash environment-variables spyder


【解决方案1】:

.bashrc 应该会在登录时自动加载到环境中

import os

print os.environ

如果你想从 bash 源文件创建一个值字典,理论上你可以这样做

output = subprocess.check_output("source /path/to/.bashrc;env")
env = dict(line.split("=") for line in output.splitlines() if "=" in line))
print env

【讨论】:

  • 实际上没有,因为当我在 Spyder 中执行 print os.environ['PATH'] 时,它会返回。 /Applications/Spyder.app/Contents/Resources:/usr/bin:/bin:/usr/sbin:/sbin: 这不是我在 .bashrc 上定义的(为了清楚起见,我在 mac 上)。我想问题出在 Spyder 本身
  • 是的,那是因为 spyder 可能正在为你设置路径......我猜你可以告诉 spyder 以某种方式使用你的 .bashrc
  • 查看groups.google.com/forum/#!msg/spyderlib/jh-QCm4mtsc/… 并查看 davids 的答案......这花了我整整 2 分钟的谷歌搜索......但看起来蜘蛛希望你使用 .profile 文件而不是 .bashrc 来做任何事情原因
  • 感谢乔兰。例如,它实际上适用于 PATH 变量,但是对于 PYTHON_PATH 在 spyder 控制台中执行 os.environ 时,我得到 'PYTHONPATH': '/Applications /Spyder-Py2.app/Contents/Resources'。在我的 bash 终端 echo $PYTHONPATH 中执行此操作时,我得到 /Applications/Spyder-Py2.app/Contents/Resources:/Applications/Trelis-15.0.app/Contents/MacOS 这就是我想要的。那么为什么 Spyder 中的 PYTHONPATH 没有被我的 .bashrc PYTHONPATH 覆盖?
  • 您是否在 .profile 中设置了 python_path 变量?我假设 spyder 需要 访问该资源目录,因此它会更改 python 路径以附加该路径...而不是替换它
【解决方案2】:

shell 的启动文件是 shell 的 启动文件。你真的想解耦,这样 Python 就不必理解 Bash 语法,并且你想从 Python 中使用的设置不会隐藏在不同实用程序的整体启动文件中。

解决此问题的一种方法是将您的环境变量放在一个单独的文件中,并将 source 该文件与您的 .bashrc 放在一起。然后,当您从 Python 调用 shell 时,如果需要,该代码可以source 同一个文件。

# .bashrc
source $HOME/lib/settings.sh

# Python >=3.5+ code
import subprocess
subprocess.run(
    'source $HOME/lib/settings.sh; exec the command you actually want to run',
    # Need a shell; need the shell to be Bash
    shell=True, executable='/bin/bash',
    # basic hygiene
    check=True, universal_newlines=True)

(如果您需要与较旧的 Python 版本兼容,请尝试 subprocess.check_call() 或什至 subprocess.call(),如果您想放弃 check_ 变体的保护措施以支持一直兼容回 Python 2.4 .)

【讨论】:

  • 我得到:FileNotFoundError: [Errno 2] No such file or directory: 'source ~/.bashrc': 'source ~/.bashrc'
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 2023-03-27
  • 2014-12-17
  • 1970-01-01
  • 2020-03-02
  • 2014-08-29
  • 1970-01-01
  • 2014-09-30
相关资源
最近更新 更多