#python #bash
#python #bash
Вопрос:
Я написал скрипт bash, который:
- Циклы для некоторых файлов dcd в рабочем каталоге
- Создает скрипт python, который выполняет постобработку этих файлов и
- Сохраняет некоторые результаты для каждого файла
for dcd in ${workdir}/*.dcd; do
dcd_name2="$(basename "$dcd")"
dcd_name="${dcd_name2/.dcd/}"
# print a python script
printf " # 1-load dcd file
dcd = parseDCD('${dcd}')
# 2- do something with the dcd file
dcd.superpose() lala
# 3- Plotting results
import matplotlib.pyplot as plt
plt.figure(figsize=(9,8))
showFractVars(md_ensemble)
plt.savefig( 'results_${dcd_name}.png' ) > ./my_python_script.py
python ./my_python_script.py
done
Теперь мне нужно изменить свой алгоритм, чтобы загружать все файлы DCD в одном скрипте циклическим способом, например, для 10 файлов dcd скрипт python должен выглядеть следующим образом
dcd1 = parseDCD('${dcd1}')
dcd2 = parseDCD('${dcd2}')
dcd3 = parseDCD('${dcd3}')
# 2- do something with the dcd file
dcd1.superpose() lala
dcd2.superpose() lala
dcd3.superpose() lala
# 3- Plotting results
import matplotlib.pyplot as plt
plt.figure(figsize=(9,8))
showFractVars(dcd1, dcd2,dcd3)
plt.savefig( 'results_${dcd_name}.png' )
Как следует изменить «цикл for» в моем первом скрипте bash для выполнения этой задачи?
Ответ №1:
Я думаю, что скрипт bash не нужен.
Я предлагаю вам использовать glob
модуль python и написать один скрипт Python, который выполняет всю логику, которую вы хотите для данного рабочего каталога
Вот пример сценария, который я написал, это лучший способ, которым вы, вероятно, могли бы справиться с этой проблемой:
# Imports
import argparse
import os
from glob import glob
# Third party imports
import matplotlib.pyplot as plt
# Constants
RESULT_NAME_TEPLATE = 'results_{file_name}.png'
def parse_dcd():
# Your logic...
pass
def handle_dcd_file(file_name):
dcd = parse_dcd('${dcd}')
# 2- do something with the dcd file
dcd.superpose()
# 3- Plotting results
plt.figure(figsize=(9,8))
showFractVars(md_ensemble)
plt.savefig(RESULT_NAME_TEPLATE.format(file_name=file_name))
def main(input_directory):
dcd_files = glob(os.path.join(input_directory, '*.dcd'))
for file_name in dcd_files:
print "Handling {file_name}".format(file_name=file_name)
handle_dcd_file(file_name)
print "Finished handling {} dcd files from '{}'".format(len(dcd_files), os.path.abspath(input_directory))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Your program description")
parser.add_argument('input_directory', nargs='?', default='.')
args = parser.parse_args()
if not os.path.isdir(args.input_directory):
parser.error("The input directory at '{}' does not exist!".format(args.input_directory))
main(args.input_directory)
Пример использования:
скрипт принимает необязательный input_directory
аргумент командной строки. Если ни один из них не указан, предполагается, что текущий каталог:
Текущий каталог python dcd_parser.py
Задан каталог python dcd_parser.py /home/user/example/dir