Возможно ли это: клонирование виртуальных сред на ноутбуки каждого пользователя, в то время как исходный код и связанные файлы остаются на сетевом диске - PullRequest
0 голосов
/ 28 мая 2019

Я написал скрипт model.py, который принимает файл csv, выполняет кучу вычислений, а затем выводит данные в мой файл Dashboard.xlsm. Все эти файлы находятся в одной папке на общем сетевом диске. Этот скрипт .py необходимо запустить, нажав кнопку в файле xlsm. Чтобы настроить это, я написал простой макрос VBA (связанный с вышеупомянутой кнопкой), который запускает файл .bat. Этот файл .bat содержит команды оболочки для создания виртуальной среды в той же папке, что и мои файлы, а затем запускает мой сценарий .py в этом venv.

Однако, активация этого венва занимает много времени (~ 1 мин). Если вместо этого я настрою venv в локальной папке, я считаю, что это значительно ускорит время выполнения.

Вопрос верхнего уровня: Является ли моя текущая настройка наилучшим способом для каждого пользователя иметь возможность запускать мой файл model.py из Excel, если нет, какие альтернативы возможны?

Вопрос среднего уровня: Является ли клонирование venv, по одному на ноутбуке каждого пользователя, способом ускорения выполнения моего кода, если нет, что еще я мог бы попытаться сделать?

Вопрос, специфичный для кода: Каков наилучший способ создания клонированного venv и обеспечения того, чтобы каждый пользователь запускал мой файл model.py из своего локального venv?

Мой ответ на вопрос верхнего уровня:

Большую часть последних 2 недель я провел, изучая альтернативы. Я пытался преобразовать мой .py файл в .exe, но ни я, ни мой коллега не смогли заставить исполняемый файл работать должным образом (мы пытались использовать Pyinstaller и Py2exe).

Затем я изучил виртуальные среды и, благодаря множеству проб и ошибок, наконец-то получил работающий прототип (но пока только работающий на меня).

Мой ответ на вопрос среднего уровня:

Честно говоря, я не знаю и не уверен, что даже Google, чтобы найти ответ на этот вопрос.

Мой ответ на конкретный вопрос:

Я думал, что мог бы сделать следующее (надеюсь) ускорить процесс:

  • Вместо сохранения venv в сетевой папке, я бы сохранял / создавал n версий venv, по одной на ноутбуке каждого пользователя (в папке, которую они не будут изменять).
  • Я создаю n .bat файлов, по одному для каждой конкретной информации о пути. Это файл, который при запуске создает venv и запускает скрипт python.
  • В моем простом макросе VBA я проверяю, какой пользователь использует файл xlsm, и соответственно активирую правильный файл .bat.

Вот что я кодировал до сих пор:

Сценарий VBA, который вызывает файл bat

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

файл bat, который устанавливает venv и запускает скрипт py

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"
'''

скрипт Python

import USER_DEFINED_MODULE #this .py file contains functions I use later on in my script
import other_stuff

делать вещи, затем выводить на dashboard.xlsm

Некоторые окончательные данные:

  1. никто не имеет прав администратора,
  2. у всех Python установлен через Anaconda,
  3. Я попытался установить python самостоятельно, но не смог сделать его работоспособным (таким образом, откат к дистрибутиву Anaconda),
  4. Да, я должен использовать Excel в качестве обоих файлов ввода / вывода.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Комментарии верхнего уровня:

Я бы сказал, что использование C или C ++ с gcc для компиляции DLL, с которой Excel vba может взаимодействовать, будет намного чище.

Если вам нужно / хотите использовать python, тогда у вас есть проблема записи в файл xlsm, пока он открыт. Таким образом, сценарий python должен быть запущен из другой книги, в которой хранятся результаты. Но тогда ярлык к сценарию будет таким же хорошим.

Лучший вариант IMO - всегда запускать файл model.py, следить за каталогом и автоматически обновлять xlsm при добавлении новых файлов или изменении файлов. Вероятно, для этого потребуется новая книга, созданная при добавлении файлов CSV. Вы можете добавить дату / время к именам файлов. Это также означает, что никому не нужна настройка их локального компьютера для запуска вашего скрипта.

Комментарии среднего уровня:

Активация вашего венва не должна быть медленной. Это будет просто показать первый раз, чтобы настроить venv. Поэтому я бы принял удар, если не оставлю настройку venv для каждого пользователя, так как это самый надежный метод.

Если большинство людей будут использовать ваш сценарий только один раз или отложить его после одного использования из-за медленной процедуры инициализации, то вам нужно что-то лучше. В качестве альтернативы можно получить установщик, который будет запускаться на всех компьютерах при следующем входе в систему, если ваш ИТ-отдел согласится Или по электронной почте людям со ссылкой, которая начнет фоновый процесс, чтобы настроить вещи в первый раз.

Комментарии низкого уровня:

Ключом было бы не запускать pip install при каждом запуске скрипта. Это медленно. Либо ваш venv настроен, либо нет. Просто проверьте, существует ли каталог venv перед запуском установки pip.

0 голосов
/ 28 мая 2019

Вам нужно сделать виртуальную среду? если все требования на локальном компьютере, вызовите файл py из пути python

...