【问题标题】:How to assign variable from a shell command to python script如何将shell命令中的变量分配给python脚本
【发布时间】:2023-05-31 08:00:02
【问题描述】:

我正在尝试使用 slurm 中的数组运行批处理。我只知道从数组(文本文件)中提取变量的 shell 命令,但未能将其分配为 Python 变量。

我必须为 Python slurm 脚本分配一个变量。我使用 shell 命令从数组中提取值。但是在将其分配给变量时遇到错误。我使用了子进程、os.system 和 os.popen。 或者有什么方法可以从文本文件中提取值用作 Python 变量?

start_date = os.system('$(cat startdate.txt | sed -n ${SLURM_ARRAY_TASK_ID}p)')

start_date = subprocess.check_output("$(cat startdate.txt | sed -n ${SLURM_ARRAY_TASK_ID}p)", shell=True)

start_date = os.popen('$(cat startdate.txt | sed -n ${SLURM_ARRAY_TASK_ID}p)').read()


start_date = '07-24-2004'

【问题讨论】:

    标签: python arrays shell slurm os.system


    【解决方案1】:

    不要使用$(...)。这将执行命令,然后尝试执行命令的输出。您希望将输出发送回 python,而不是由 shell 重新执行。

    start_date = subprocess.check_output("cat startdate.txt | sed -n ${SLURM_ARRAY_TASK_ID}p", shell=True)
    

    【讨论】:

      【解决方案2】:

      Barmar 是正确的,$(...) 部分是为什么你没有得到你想要的,但真正的问题是为什么当你使用 python 时你还想使用 cat 和 sed。只需打开文件并提取您想要的信息

      import os
      with open("startdate.txt", "r") as fh:
          lines = fh.readlines()
      start_date = lines[os.environ['SLURM_ARRAY_TASK_ID']].strip()
      

      .strip() 部分去掉了换行符。

      【讨论】:

      • 谢谢马尔科姆。但我收到此错误:NameError: name 'SLURM_ARRAY_TASK_ID' is not defined。 'SLURM_ARRAY_TASK_ID' 应该是文本文件中的列名吗?
      • SLURM_ARRAY_TASK_ID 仅在您将 SLURM 作业作为数组提交时才设置(即使用 --array)
      • 抱歉,耽搁了。我错过了在您的示例中 ${SLURM_ARRAY_TASK_ID} 实际上是在执行命令字符串时从环境变量中扩展的。要在你的 python 脚本中得到它,你需要从 os.environ 中提取它。我将编辑我上面的代码以展示如何做到这一点