【问题标题】:Running 'export' command with Pythons 'subprocess' does not work使用 Python 的“子进程”运行“导出”命令不起作用
【发布时间】:2016-09-13 11:44:36
【问题描述】:
subprocess.run('export FOO=BAR', shell=True)

这根本行不通,我不知道为什么。

我要做的就是从我的 python (3.5.1) 脚本中设置一个环境变量,当我运行上面的行时,什么也没有发生。没有报错,当我自己检查环境变量时,还没有设置。

其他带有subprocess.run() 的shell 命令do 工作,例如lspwd,但不是export

.run() 是在 Python 3.5 中添加的(以防你不认识它),但我也尝试了上面的行与 .call().Popen(),结果没有变化。

我知道我可以使用os.environ['FOO'] = "BAR" 在 python 中设置环境变量,但我会在我的项目中大量使用 shell 命令,并且我希望我需要将多个命令串在一起,这将使得使用 @ 987654331@ 比os.environ 容易。

我的项目将在 Linux 上运行,这就是我的机器所运行的。

【问题讨论】:

  • 想想:每个subprocess.run(shell=True) 都会启动一个新的shell。打开两个终端并在一个终端中键入 export FOO=BAR,在另一个终端中键入 echo $FOO(运行单独 shell 的第二个终端将看不到新的 $FOO 值)。这与cd 是内置shell 的原因相同(因为它会更改当前进程的工作目录,如果它是一个单独的程序,那么cd 将不得不更改父进程的环境——这不能完成(通常))。见How do I set the working directory of the parent process?

标签: python bash shell command subprocess


【解决方案1】:

它工作正常;但是,变量设置只存在于子流程中。您不能从子进程中影响本地进程的环境。

os.environ 是正确的解决方案,因为它会更改本地进程的环境,并且这些更改将被任何以subprocess.run 开头的进程继承。

您也可以将env 参数用于run

subprocess.run(["cmdname", "arg1", "arg number 2"], env=dict(FOO='BAR', **os.environ))

这会在包含FOO=BAR 的修改环境中运行命令,而不修改当前环境。

【讨论】:

  • 啊。那么我唯一的选择是使用os.environ,还是我还能做些什么?
  • 我不知道你为什么这么反对使用os.environ。这在shell脚本中使用shell的内置export命令的Python等价物。
  • 就像我说的,我希望将多个命令串在一起;我相信将export 添加到我需要执行的命令列表中会更容易,而不是在单独的 python 函数中这样做。不过没关系,我可以弄清楚一些事情。感谢您的回答,它解释了为什么它没有按我预期的那样工作:)
  • 你可以用dict(os.environ, FOO='BAR')代替dict(FOO='BAR', **os.environ)
猜你喜欢
  • 2020-07-25
  • 2021-12-07
  • 1970-01-01
  • 2021-11-10
  • 2019-04-17
  • 1970-01-01
  • 2021-04-03
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多