Я написал сценарий model.py, который принимает CSV-файл, выполняет ряд вычислений, а затем выводит данные в мой файл Dashboard.xlsm. Все эти файлы находятся в одной папке на общем сетевом диске. Этот сценарий .py должен запускаться нажатием кнопки в файле xlsm. Чтобы настроить это, я написал простой макрос VBA (связанный с вышеупомянутой кнопкой), который запускает файл .bat. Этот файл .bat содержит команды оболочки для создания виртуальной среды в той же папке, что и мои файлы, а затем запускает мой сценарий .py в этом venv.
Однако активация этого venv занимает много времени (~ 1 мин). Если вместо этого я настрою venv в локальной папке, я полагаю, что это значительно ускорит время выполнения.
Вопрос верхнего уровня: Является ли моя текущая настройка лучшим способом для каждого пользователя, чтобы он мог запускать мой файл model.py из Excel, если нет, какие альтернативы возможны?
Вопрос среднего уровня: Является ли клонирование venv, по одному на ноутбуке каждого пользователя, способом ускорить выполнение моего кода, если нет, что еще я могу попытаться сделать?
Конкретный вопрос по коду: Как лучше всего создать клонированный venv и убедиться, что каждый пользователь будет запускать мой файл model.py из своего локального venv?
Мой ответ на вопрос верхнего уровня:
Я провел большую часть последних 2 недель, изучая альтернативы. Я пытался преобразовать свой файл .py в .exe, но ни я, ни мой коллега не смогли заставить исполняемый файл работать должным образом (мы пытались использовать Pyinstaller и Py2exe).
Затем я изучил виртуальные среды и, путем множества проб и ошибок, наконец, получил работающий прототип (но пока он работает только на меня).
Мой ответ на вопрос среднего уровня:
Честно говоря, я не знаю и не уверен, что даже гуглить, чтобы найти ответ на этот вопрос.
Мой ответ на конкретный вопрос:
Я подумал, что могу сделать следующее, чтобы (надеюсь) ускорить процесс:
Вот что я закодировал до сих пор:
Sub run_model()
Dim folderPath As String
Dim shellCommand As String
ActiveSheet.EnableCalculation = False
ActiveSheet.EnableCalculation = True
ActiveWorkbook.save
folderPath = Application.ActiveWorkbook.Path
shellCommand = folderPath & "\" & "USER_NAME_GOES_HERE.bat"
Call Shell(shellCommand, vbNormalFocus)
End Sub
chdir I:\NETWORK_PATH
I:
python -m venv venv/
"./venv/Scripts/activate.bat" & pip install -r ./src/requirements.txt & "./venv/Scripts/activate.bat" & python "./src/MODEL.py"
'''
import USER_DEFINED_MODULE #this .py file contains functions I use later on in my script
import other_stuff
делать что-то, а затем выводить в панель инструментов.xlsm
Некоторые заключительные детали:
Нет необходимости создавать файлы н для конкретных пользователей .bat
— просто передайте им параметр с именем пользователя, чтобы настроить его по мере необходимости. Облегчает обслуживание ТОНН
Комментарии верхнего уровня:
Я бы сказал, что использование C или C++ с gcc для компиляции DLL, с которой может работать интерфейс excel vba, было бы намного чище.
Если вам нужно/хотите использовать python, у вас возникнет проблема с записью в файл xlsm, пока он открыт. Таким образом, скрипт Python должен запускаться из другой книги, отличной от той, в которой хранятся результаты. Но тогда ярлык к сценарию был бы ничуть не хуже.
Лучший вариант IMO - всегда запускать ваш model.py, отслеживать каталог и автоматически обновлять xlsm при добавлении новых файлов или изменении файлов. Это, вероятно, требует создания новой книги всякий раз, когда добавляются файлы csv. Вы можете добавить дату/время к именам файлов. Это также означает, что никому не нужна настройка локального компьютера для запуска вашего скрипта.
Комментарии среднего уровня:
Активация вашего venv не должна быть медленной. Это будет показано при первой настройке venv. Так что я бы принял удар, если бы не оставил venv для настройки для каждого пользователя, поскольку это самый надежный метод.
Если большинство людей воспользуются вашим скриптом только один раз или отложат работу после первого использования из-за медленной процедуры инициализации, то вам нужно что-то получше. Альтернативой является запуск установщика на всех компьютерах при следующем входе в систему, если ваш ИТ-отдел согласен. Или по электронной почте людям со ссылкой, которая запустит фоновый процесс, чтобы настроить вещи в первый раз.
Комментарии низкого уровня:
Ключ в том, чтобы не запускать pip install
каждый раз, когда вы запускаете скрипт. Это медленно. Либо ваш venv настроен, либо нет. Просто проверьте, существует ли каталог venv перед запуском установки pip.
Вам нужно сделать виртуальную среду? если все требования находятся на локальной машине, вызовите файл py из пути python
Создание venv гарантирует, что программа будет работать независимо от того, что мои коллеги сделают со своим собственным дистрибутивом Python. Это уменьшит возможные проблемы в будущем.
Когда я создаю .exe, я обнаружил, что вы не получите сообщения об ошибках, если вы не работаете из окна cmd. Кроме того, если вы делаете что-то на основе Excel, иногда библиотеки копируются неправильно. Я обнаружил, что после сборки иногда вам нужно зайти в lib/xlwt и скопировать ExcelFormulaLexer.pyc и ExcelFormulaParser.pyc из вашего собственного каталога Python.