Как назначить переменную из команды оболочки для скрипта Python - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь запустить пакетный процесс с использованием массива в slurm. Я знаю только команду оболочки для извлечения переменной из массива (текстовые файлы), но мне не удалось назначить ее как переменную Python.

Мне нужно назначить переменную для сценария Python slurm. Я использовал команду оболочки для извлечения значений из массива. но сталкиваются с ошибками при назначении его переменной. Я использовал подпроцесс, 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'

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Не используйте $(...). Это выполнит команду, а затем попытается выполнить вывод команды. Вы хотите, чтобы вывод был отправлен обратно в python, а не был повторно выполнен оболочкой.

start_date = subprocess.check_output("cat startdate.txt | sed -n ${SLURM_ARRAY_TASK_ID}p", shell=True)
0 голосов
/ 15 октября 2019

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() часть избавится от символа новой строки.

...