#python #vba #operating-system #pyinstaller #xlsxwriter
#питон #vba #операционная система #pyinstaller #xlsxwriter
Вопрос:
Я создал .EXE
файл из Python scripy с помощью pyinstaller.
Часть программы должна получить файл xlsm и извлечь его VBA в файл bin. Я передаю файл xlsm в EXE-файл, используя .spec
файл:
datas=[('gen_ClipFile_V3p1.xlsm','.')],
Затем, когда программа получит возможность извлечь ‘VBAProject.bin’ из файла xlsm
Я получаю сообщение об ошибке:
‘vba_extract.py ‘ не распознается как внутренняя или внешняя команда
Мой соответствующий код:
import xlsxwriter
import os
from pathlib import Path
# a function called by tkinter file open
def compareDesigns(self):
# find the EXE temporary working directory path
bundle_dir = Path(getattr(sys, '_MEIPASS', Path.cwd()))
strbundle_dir = str(bundle_dir)
XLSMtoExtract = os.path.join(strbundle_dir, 'gen_ClipFile_V3p1.xlsm')
os.system("vba_extract.py" XLSMtoExtract)
Мой файл спецификации включает в себя:
datas=[('gen_ClipFile_V3p1.xlsm','.')],
hiddenimports=['matplotlib', 'pathlib', 'time', 'sys', 're', 'operator', 'numpy', 'mplcursors', 'collections', 'xlsxwriter', 'os', 'tkinter', 'pyinstaller'],
Мне удается запустить приложение на моем компьютере, но другие пользователи с другими компьютерами сообщают об этой ошибке.
Я верю, что я должен найти vba_extract.py путь во временной области exe и ссылка на него, но я знаю, как это сделать.
Ответ №1:
Если xlsxwriter установлен правильно, его vba_extract.py
следует добавить в Windows %PATH%. Однако это может быть недоступно в той же среде, в которой выполняется ваш основной скрипт.
Некоторые предложения, в порядке, обратном рекомендациям:
- Выясните проблему с путем.
- Игнорируйте проблему с путем и включите
vba_extract.py
код непосредственно в свою программу. Он не очень большой, и вы могли бы пропустить большую часть обработки исключений, если знаете, что с целевым файлом xlsm все в порядке. - Игнорируйте часть извлечения макроса и просто отправьте макрос VBA с кодом. Однако это также может привести к проблемам с путями.
- Вы также можете сохранить макрос в шестнадцатеричном / текстовом формате в своей программе и преобразовать его обратно в двоичный файл «на лету».