0 / 0 / 0
Регистрация: 20.03.2024
Сообщений: 16

Программа работает в VS code, но при упаковке в exe - ошибки

02.11.2024, 17:21. Показов 1544. Ответов 21

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Помогите, пожалуйста, решить проблему. Есть код, который перекладывает данные из одних файлов Excel в другие. Используется для этого pandas и openpyxl. Много папок и файлов, поэтому реализована параллельная работа по ядрам процессора с помощью библиотеки joblib. Также прикручен интерфейс библиотекой tkinter. Если это дело запускаю из среды VS code, как и ожидается появлется меню для работы. Там выбираю папку для обработки, запускаю основную функцию main(). В ней параллельно вызывается функция func, которая и делает все процессы. При этом программа завершается без ошибок и корректно производит все действия. Судя по диспетчеру задач, в самом деле используется все 4 ядра процессора виден процесс Python четыре раза в загрузкой 23% ЦП каждый).

Запаковываю в exe файл с помощью pyinstaller prod_mult.py. Запускаю получившийся exe. Однопоточные процессы протекают нормально, когда программа переходит к параллельному исполнению, внезапно открывается пять копий моего интерфейса и останавливается выполнение. В диспетчере задач при этом уже пять копий процесса prod_mult.exe. Если закрыть любую лишнюю копию интерфейса, в консоль выводится ошибка. Никаких действий с файлами в результате, разумеется, не выполняется.

Ошибка: Не удается найти процесс "39976".
Exception in Tkinter callback
Traceback (most recent call last):
File "tkinter\__init__.py", line 1892, in __call__
File "f11_prod_mult.py", line 224, in main
File "joblib\parallel.py", line 2007, in __call__
File "joblib\parallel.py", line 1650, in _get_outputs
File "joblib\parallel.py", line 1754, in _retrieve
File "joblib\parallel.py", line 1789, in _raise_error_fast
File "joblib\parallel.py", line 745, in get_result
File "joblib\parallel.py", line 763, in _return_or_raise
joblib.externals.loky.process_executor.T erminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker.

Пробовал сжимать с явным указанием специфических библиотек pyinstaller --hidden-import=joblibprod_mult.py и вообще с указанием всех используемых библиотек. Результат тот же. Вспотыкается он о joblib.

В чем может быть причина? Почему через VS code работает без проблем? Версия Питона - 3.9.13. Версия pyinstaller - 6.9.0

Код, к сожалению, полностью не могу привести. Вот его структура:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from pathlib import Path
import openpyxl
from openpyxl import load_workbook
import pandas as pd
from joblib import Parallel, delayed
 
import tkinter as tk #модуль для создания пользовательского интерфейса
from tkinter import messagebox, filedialog, Tk, Frame, Button, Text, Scrollbar, Label # Импортируем нужные функции и классы из модуля tkinter
 
#эта фукнция вызывается в параллельных потоках. в каждой папке fil берет данные из нужных файлов и вставляет в один общий, с помощью pandas
def func(spr, mr, fil):
 
    for shab in fil.iterdir():
        if shab.suffix == ".xlsx":
            for key, values in spr.items():
                if shab.name.startswith(values[0]):
 
                    *
                    
#здесь создается итоговое сообщение
def create_result_window():
    
    *
 
    root.mainloop()
 
#фукнция, запускаемая из пользовательского интерфейса, делает все действия
def main():
 
    # Создаем словарь-справочник. Ключи - имена листов, куда будем вставлять данные. Значения - С чего начинается файл, с которго берем данные, 
    # имя листа, с которго берем данные, имя столбца, по которому фильтруем
    spr = {}
 
    #Путь к папке с отчетами - из пользовательского интерфейса
    folder_path = Path(target_folder)
                       
    # Для каждой папки с макрорегионом в директории папки
    for mr in folder_path.iterdir():
        #если это папка...
        if mr.is_dir():
            #создаем список с папками fil в папке mr
            fil_dirs = [fil for fil in mr.iterdir() if fil.is_dir()]
            delayed_calls = [delayed(func)(spr, mr, fil) for fil in fil_dirs]
            results += Parallel(n_jobs=-1)(delayed_calls)
 
    create_result_window()
 
#фукнция для выбора рабочей папки
def choose():
    *
 
# Пользовательский интерфейс
root_i = tk.Tk()
root_i.title("11ф - формирование отчетов (multi). вер. 28.10.2024")
root_i.geometry("800x550")
root_i.configure(bg="alice blue")
root_i.resizable(False, False)
 
*
 
if __name__ == "__main__":
    root_i.mainloop()
Может загвоздка в пресловутом if __name__ == "__main__"?

Добавлено через 8 минут
Вот содержимое файла spec, если для чего-то полезно.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# -*- mode: python ; coding: utf-8 -*-
 
 
a = Analysis(
    ['f11_prod_mult.py'],
    pathex=[],
    binaries=[],
    datas=[],
    hiddenimports=['joblib'],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)
 
exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='f11_prod_mult',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
)
coll = COLLECT(
    exe,
    a.binaries,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='f11_prod_mult',
)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2024, 17:21
Ответы с готовыми решениями:

Повреждение exe при упаковке или распаковке
Привет! Написал программу, но когда передал её товарищу, оказалось, что она работает неправильно. Долго тестировал, пока не убедился, что...

Установка версии exe при упаковке через PyInstaller
Хочу сделать так, чтобы PyInstaller при сборке проекта прописывал в EXE текущую версию релиза, которая храниться в заданном файле. Создал...

Программа работает некорректно при запуске из *.exe
Появилось весьма интересная проблема: при запуске моей программы из *.exe-файла она работает некорректно (некоторые из используемых флажков...

21
1713 / 580 / 76
Регистрация: 10.04.2009
Сообщений: 9,335
05.11.2024, 10:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от anton78spb Посмотреть сообщение
Если расшарить папку на сервере, где будет лежать софт, для локальных компьютеров пользователей, то можно.
Как расшарить папку?

Создание папки: Сначала создайте папку на сервере, где будет храниться софт.

Настройка прав доступа: Установите права доступа для пользователей или групп, которые будут иметь возможность открывать, изменять или удалять файлы в этой папке.

Общий доступ: Включите общий доступ к папке через настройки операционной системы (например, Windows).

Проверка доступа: Убедитесь, что пользователи могут получить доступ к папке и что права доступа настроены правильно.

Добавлено через 15 минут
нагуглил, но НЕ проверял:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import os
import subprocess
 
# Путь к папке
soft_path = r'I:\soft'
 
# Функция для проверки, расшарена ли папка
def is_shared(path):
    try:
        # Выполняем команду PowerShell для проверки расшаривания
        result = subprocess.run(
            ['powershell', '-Command', f"Get-SmbShare | Where-Object {{ $_.Path -eq '{path}' }}"],
            capture_output=True,
            text=True
        )
        # Если результат не пустой, значит папка расшарена
        return bool(result.stdout.strip())
    except Exception as e:
        print(f"Ошибка при проверке: {e}")
        return False
 
# Функция для расшаривания папки
def share_folder(path):
    try:
        # Выполняем команду PowerShell для расшаривания папки
        subprocess.run(
            ['powershell', '-Command', f"New-SmbShare -Name 'SoftShare' -Path '{path}' -FullAccess 'Everyone'"],
            check=True
        )
        print(f"Папка '{path}' успешно расшарена.")
    except subprocess.CalledProcessError as e:
        print(f"Ошибка при расшаривании папки: {e}")
 
# Проверяем, расшарена ли папка
if is_shared(soft_path):
    print(f"Папка '{soft_path}' уже расшарена.")
else:
    print(f"Папка '{soft_path}' не расшарена. Расшариваем...")
    share_folder(soft_path)
0
Эксперт .NET
 Аватар для Usaga
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,719
06.11.2024, 15:43
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
Докер — это открытая платформа для разработки, доставки и эксплуатации приложений.
Докер не для прикладного ПО для рабочих станций. Он для развёртывания сервисов на серверах. Реже - разработчикам локально какой-нибудь GCC в виде готовой среды сборки развернуть. И не смотря на то, что докер имеет доступ к видюхе, GUI-приложения в нём не живут. Это для задач использующих CUDA.

Так что сюда докер приплетать точно мимо. Да и ставить его всё равно надо, чего ТС не хочет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.11.2024, 15:43

Не работает программа в Heroku, на телефоне работает, в heroku deploy дела, но при запуске крашится. Ошибки не понятные
Скачал у человека с Ютуба прогу, которая в телеге пишет комментарии к сообщениям на канале. В pydrone3 работает нормально, но постоянно в...

Программа телефонный справочник работает, но при выполнении возникают ошибки
Программа телефонный справочник работает, но при выполнении возникают ошибки помогите исправить и составить блок схему программы (Ссылка...

Программа работает при дебаггинге (F5) из студии, но собранный .exe, запущенный отдельно - нет
Проблема в заголовке. Моя программа делает автоматическое копирование сохраняемых на внешний носитель файлов в заранее определённую...

Ошибки вызова стека vs code программа hello world
Вот такие ошибки ntdll.dll!ntdll!LdrInitShimEngineDynamic (Unknown Source:0) ntdll.dll!ntdll!LdrInitShimEngineDynamic (Unknown...

Ошибки explorer.exe и drwtsn32.exe при работе с word и excel файлами
компьютер очень медленно работает, а после открытия word выдает ошибку explorer.exe поcле компьютер зависает, пока не перезагрузишь систему.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Опции темы

Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru