(Примечание: я использую блокнот Jupyter для своего основного сценария и сохраняю функцию во внешнем файле "functions.py". Это необходимо для работы нескольких процессов внутри блокнота.)
Functions.py
Функция запускает внешнюю программу, которая выполняет итеративные вычисления, выдавая выходные данные после каждой итерации. Я фиксирую этот вывод в цикле for, который сам выполняет итерацию только при появлении нового вывода
Код: Выделить всё
def run_exe_instance(args):
import os
import subprocess
#do stuff
os.chdir(directory)
exe_process = subprocess.Popen(["program.exe"],shell=True,stdout=subprocess.PIPE)
os.chdir(notebookFolder) #Switches directory back to notebook folder
for i1 in range(number_of_exe_iterations): #THE LOOP TO TRACK ITERATIONS OF
if (line := exe_process.stdout.readline()) != "":
pass
print("Finished!")
Код: Выделить всё
import os
import subprocess
import multiprocessing
import Functions as f
if __name__ == "__main__":
__spec__ = None #bugfix for iPython/Jupyter Notebook
args = [(some args,),(some more args,)]
pool = mp.Pool(len(args))
pool.starmap(f.run_exe_instance, args)
pool.close()
pool.join()
Сначала я попробовал использовать tqdm внутри функции. Однако любые выходные данные внутри функции выводятся в окно командной строки «Anaconda Prompt», которое я использовал для запуска своего блокнота Jupyter. В этом окне индикаторы выполнения не работают.
Код: Выделить всё
def run_exe_instance(args):
import os
import subprocess
#do stuff
os.chdir(directory)
exe_process = subprocess.Popen(["program.exe"],shell=True,stdout=subprocess.PIPE)
os.chdir(notebookFolder) #Switches directory back to notebook folder
for i1 in tqdm(range(number_of_exe_iterations),desc=filename,position=bar_position): #THE LOOP TO TRACK ITERATIONS OF
if (line := exe_process.stdout.readline()) != "":
pass
print("Finished!")
Я также пробовал использовать p_tqdm. Однако индикаторы выполнения повторяются только каждый раз, когда функция возвращается. В случае с моей функцией она не завершится до тех пор, пока не завершится «program.exe».
Будем очень благодарны за любые идеи.
Подробнее здесь: https://stackoverflow.com/questions/792 ... oop-within