【问题标题】:How to access Bash environment variable in Python using subprocess?如何使用子进程在 Python 中访问 Bash 环境变量?
【发布时间】:2014-08-24 22:46:02
【问题描述】:

我可以在 Python 中使用subprocess-handled 查询来确定终端的宽度,如下所示:

int(subprocess.Popen(['tput', 'cols'], stdout = subprocess.PIPE).communicate()[0].strip('\n'))

如何以类似的方式确定 Bash 用户名?那么,如何使用子进程在 Python 中查看 ${USER} 的值?

【问题讨论】:

  • 为什么要使用subprocess? python进程本身可以访问环境。
  • 您可以为此使用os.environ。例如print(os.environ['USER'])
  • 非常感谢您的建议。部分动机是想了解如何在 subprocess 方法中使用 Bash 变量。我不知道该怎么做。访问环境变量 ${USER} 就是一个简单的例子。
  • 问题是,使用 bash 风格的变量名调用 Python 子进程不会做任何变量扩展、通配等操作。Python 子进程之间没有 shell,而你的程序的 argv/argc正在调用。
  • 无关:在 Python 3.3+ 中有shutil.get_terminal_size() function,用于获取终端的宽度/高度。

标签: python bash variables subprocess


【解决方案1】:

正如 Wooble 和 dano 所说,不要为此使用子进程。使用os.getenv("USER")os.environ["USER"]

如果你真的想使用subprocess,那么Popen(['bash', '-c', 'echo "$USER"'], ...) 似乎和Popen("echo $USER", shell=True) 一样有效,尽管它们都不是特别令人愉快(尽管要在正在执行的命令行上使用环境变量,所以必须涉及 shell,所以你无法避免)。

编辑:我之前的子流程建议似乎无法正常工作。我相信我最初的测试有缺陷。

【讨论】:

  • 非常感谢您对使用模块osgetenvenviron 方法的建议。这很好用。想要使用模块subprocess 的部分动机是想了解如何在subprocess 方法中使用Bash 变量。我已经尝试过您的subprocess.Popen(['echo', '${USER}']) 建议,但在 Python 2.7.6 和 3.4.0 中都显示了“${USER}”作为响应,而不是实际的环境变量值。你知道如何获取实际值吗?
  • 啊,太好了。您的编辑使这项工作发挥了作用。再次感谢您的帮助!
  • @Etan Reisner:不要同时使用列表参数和shell=True。如果您改用shell=True,请始终传递一个字符串。
  • @J.F.Sebastian 你愿意告诉我为什么吗? (我绝不是蟒蛇人。)
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2021-12-07
  • 2013-12-15
  • 2012-06-15
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多