В настоящее время я работаю над научным проектом, в котором мне нужно обработать исходный набор данных, отфильтровать / объединить / вычислить материал. Конвейер требует серию шагов (~ 10), каждый из которых выполняется в отдельном модуле Python. Как правило, модуль python включает создание некоторого промежуточного файла и, в конце концов, запускается внешняя команда bash, вызывающая внешние программы. В конечном счете, мой вопрос заключается в том, как обрабатывать довольно большое (и растущее) количество переменных (путей к файлам, создаваемым в конвейере), которые мне нужно отслеживать шаг за шагом. Вот упрощенное резюме моего реального main.py
import ld
import kinship
import PCA
def main(args):
#LD pruning & build new plink file
args.ld_path = join(args.oPath,'ld/')
ld.pruning(args)
args.plink_path = join(args.oPath,'plink_files/')
ld.build_plink_file(args)
# build new plink file and calculate kinship
pretty_print('KINSHIP')
args.kinPath = join(args.oPath,'kinship/')
kinship.download_king()
kinship.kinship(args)
#RUN PCA
args.pca_path = join(args.oPath,'pca/')
PCA.build_inliers(args)
PCA.fast_pca_inliers(args)
PCA.project_outliers(args)
if __name__=='__main__':
parser=argparse.ArgumentParser(description="Returning final list of variants after info_score filter and ld pruning")
parser.add_argument('-b',"--bed", type=file_exists, help = "Folder in which the merged plink file is stored", required = True)
parser.add_argument('-o',"--oPath",type = str, help = "folder in which to save the results", required = True)
#LD PRUNING
parser.add_argument('--ld',nargs=3,metavar = ('SIZE','STEP','THRESHOLD'),help ='size,step,threshold',required = True)
#KINSHIP
parser.add_argument('--degree',type=float,help='Degree for Kinship',default = 2)
#PCA
parser.add_argument('--pca-components',type=int,help='Components needed for pca',default = 20)
main(args)
Как вы можете видеть, в моем конвейере я использовал (*) класс argparse
, "расширяя" синтаксический анализатор, создавая новые переменные, так что я могу просто передать класс args
из одного модуля в Другой. Я также подумал об использовании settings
, но помимо некоторых «официальных» выходных данных, есть также несколько промежуточных файлов, которые не передаются непосредственно непосредственно на следующий шаг конвейера, но это может потребоваться в нескольких шагах в будущем. так что я бы предпочел не определять их все сразу.
Есть ли лучшее / более чистое решение для этого?
Спасибо