Совместное использование переменных в модулях конвейера - PullRequest
0 голосов
/ 15 ноября 2018

В настоящее время я работаю над научным проектом, в котором мне нужно обработать исходный набор данных, отфильтровать / объединить / вычислить материал. Конвейер требует серию шагов (~ 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, но помимо некоторых «официальных» выходных данных, есть также несколько промежуточных файлов, которые не передаются непосредственно непосредственно на следующий шаг конвейера, но это может потребоваться в нескольких шагах в будущем. так что я бы предпочел не определять их все сразу.

Есть ли лучшее / более чистое решение для этого?

Спасибо

1 Ответ

0 голосов
/ 15 ноября 2018

Возможно, в моем первом модуле будет класс конфигурации, а затем я передам инстанс, протравив его.Любые значения могут быть просто сохранены в классе dict.Это легко сломать, но для простого подхода это, вероятно, сделает свое дело ...

import pickle

class Configuration:
    def __init__(self, file_path):
        self.path = file_path

    def dump(self):
        with open(self.path, 'w+') as config_file:
            pickle.dump(self, config_file)

config = Configuration(r"C:\temp\config.file")
config.kinship_degree = 3

config.dump()

with open(r"C:\temp\config.file") as cf:
    restored_config = pickle.load(cf)

print restored_config.kinship_degree)

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

...