Как назначить переменную из команды оболочки скрипту Python

Я пытаюсь запустить пакетный процесс, используя массив в 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'

person Arun Bawa    schedule 14.10.2019    source источник


Ответы (2)


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

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

Бармар прав, часть $(...) - это то, почему вы не получаете то, что хотите, но реальный вопрос заключается в том, почему, когда вы используете 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() избавляется от символа новой строки.

person Malcolm    schedule 14.10.2019
comment
Спасибо Малкольм. но я получил эту ошибку: NameError: имя «SLURM_ARRAY_TASK_ID» не определено. Является ли «SLURM_ARRAY_TASK_ID» именем столбца в текстовом файле? - person Arun Bawa; 15.10.2019
comment
SLURM_ARRAY_TASK_ID устанавливается только в том случае, если вы отправляете задание SLURM в виде массива (т. е. с --array) - person ciaron; 15.10.2019
comment
Извините за задержку. Я пропустил, что в вашем примере ${SLURM_ARRAY_TASK_ID} фактически расширяется из переменных среды при выполнении вашей командной строки. Чтобы получить это в своем скрипте Python, вам нужно вытащить его из os.environ. Я отредактирую свой код выше, чтобы показать, как это сделать. - person Malcolm; 25.10.2019