【问题标题】:translating bash script to python将 bash 脚本翻译成 python
【发布时间】:2014-04-25 20:43:19
【问题描述】:

我有一些简单的 bash 脚本,我想用 python 进行翻译。在使用子进程调用外部程序之前,我需要定义一些 bash 环境变量。特别是我需要加载一个模块环境。原始的 bash 看起来像这样

#!/bin/bash 
source /etc/profile.d/modules.sh
module purge
module load intel

./my_code

我想用子进程调用my_code,但是如何将module定义的变量传递给shell?

编辑:

我第一次尝试转换上面的脚本是

#!/usr/bin/python -tt
import subprocess

subprocess.call("source /etc/profile.d/modules.sh",shell=True)
subprocess.call("module purge",shell=True)
subprocess.call("module load intel",shell=True)
subprocess.call("./mycode",shell=True)

但这失败了,因为环境变量(我认为是 LIBRARY_PATH 和 PATH 和 C_INCLUDE)在子进程启动的 shell 中被修改,但是随后这个 shell 死掉了,并且这些变量不会被后续的 shell 继承。所以问题是:如何启动模块命令,然后使用 os.environ 保存相关变量?

【问题讨论】:

  • 那么你的问题是什么?
  • 我想现在问题很清楚了,不是吗?

标签: python bash scripting subprocess


【解决方案1】:

import os

os.environ 是环境变量的字典(导出的 shell 变量)

【讨论】:

  • 我修改了我的问题
【解决方案2】:

您可以使用多行字符串,以便在同一个 shell 进程中修改环境:

from subprocess import check_call

check_call("""
source /etc/profile.d/modules.sh
module purge
module load intel

./my_code
""", shell=True, executable="/bin/bash")

另见Calling the “source” command from subprocess.Popen

【讨论】:

  • 是的,这当然是一个解决方案。但是你知道上面的代码是一个简化,在模块加载和对 mycode 的调用之间我做了一些字符串操作,我实际上调用了几个使用相同模块的程序,所以这不会很优雅
  • @simona: 什么意思:“不会很优雅”
  • 将环境变量从一个 shell 传递到另一个 shell 对我来说似乎更干净,就像在 bash 中使用 export 所做的那样,一定有办法做到这一点。
  • @simona:为什么需要多个 shell 进程?另外,请查看the link that I've added above
猜你喜欢
  • 2013-07-24
  • 2014-08-13
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
相关资源
最近更新 更多