Обработка исключений в многопроцессорной обработке Python - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь выполнить скрипт, используя многопроцессорность. Но в случае ошибок скрипт не выдает исключение, а вытаскивает из обработки. Возможно ли получить исключение и выйти из казни. Я не могу понять, как это сделать, поскольку я новичок в python.

Ниже приведен сценарий, который я написал:

import os 
import sys
import string
import multiprocessing as mp

path=sys.argv[1]

path_tpt=path+'/tpt_script'


""" Multiprocessing module to generate intermediate exports"""



total_tpt_file_list = []
for filename in os.listdir(path_tpt):
    total_tpt_file_list.append(os.path.join(path_tpt,filename))

total_tpt_file_list = list(filter(lambda x:x.endswith('.tpt'), total_tpt_file_list))
total_tpt_file_list = sorted(total_tpt_file_list)
print(total_tpt_file_list) 



def run_sed (file_list):
    x=file_list.rsplit("/", 2)
    y=x[0]
    file_name=x[2]
    print(file_name)
    path_ctl=str(y)+'/ctl_file'
    path_tpt=str(y)+'/tpt_script'
    path_log=str(y)+'/log'
    print("tbuild -f  "+ (file_list) + " -j  "+ 'tpt_chk_$$ '+ '> '+ os.path.join(path_log,file_name).split('.')[0]+'.log 2>>'+ os.path.join(path_log,file_name).split('.')[0]+'.log')
    status=os.system("tbuild -f  "+ (file_list) + " -j  "+ 'tpt_chk_$$ '+ '> '+ os.path.join(path_log,file_name).split('.')[0]+'.log 2>>'+ os.path.join(path_log,file_name).split('.')[0]+'.log')

try:    
    p = mp.Pool(processes=(mp.cpu_count()-1))
    total_file_list = p.map(run_sed,total_tpt_file_list)

finally:
    p.close()
    p.join()
    print("done")

Пожалуйста, дайте мне знать, если больше информации

Заранее спасибо.

1 Ответ

0 голосов
/ 26 февраля 2020

Python исключения будут распространяться обратно, учитывая то, что я вижу, я предполагаю, что вы хотите, чтобы ошибки от вашего os.system вызова были подняты. Вам нужно сделать что-то вроде

if status != 0: 
    raise Exception("eeek")

Что я действительно рекомендую, вместо использования os.system это использовать subprocess.check_output https://docs.python.org/3/library/subprocess.html#subprocess .check_output Это автоматически проверит код состояния вызова подпроцесса и вызовите любое исключение с помощью кода состояния и выходного текста. Итак, ваш код будет выглядеть примерно так:

    subprocess.check_output(["tbuild", "-f"] + file_list + ["-j", "tpt_chk_$$", ...

Вы также можете захотеть вернуть вывод (return subprocess.check_output...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...