Запустить скрипт Python нажатием кнопки из Excel

Возникла необходимость периодически обновлять данные в ячейках таблицы Excel. Сам алгоритм перерасчета тяжелый и основан на ML-модели, уложенного в скрипт Python. Но использовать его будут пользователи, далекие от мира программирования, поэтому необходимо сделать так, чтобы обновление (то есть отработку самого скрипта) возможно было запустить нажатием обычной кнопки на этом же листе Excel. Для понимания прикладываю то, чего нужно добиться: При нажатии кнопки «Обновить» должен запускаться заранее разработанный скрипт Python, который, в конечном счете, обновит значения всех ячеек таблицы. Возникли очень большие сложности с тем, как реализовать данную идею, а в интернете ничего более-менее понятно изложенного я не нашел. помогите, пожалуйста, решить данную задачу. Для облегчения понимания предположим, что:
- скрипт Python лежит в папке с путем «С:\folder_script»
- название скрипта «script»
- эксель-файл лежит в папке с путем «С:\folder_table»
- название скрипта «table»
Уже очень долго не могу сделать ничего толкового. Заранее благодарен)))
Отслеживать
задан 6 фев в 15:06
Иван Тармосин Иван Тармосин
1 1 1 бронзовый знак
не уверен, что питону микрософт позволит писать в открытый файл. видимо, надо делать макрос, если он позволяет, то стартовать оттуда питон и заполнять результатом лист
6 фев в 15:30
Я прописал в скрипте питона, чтобы он закрывал открытый файл самостоятельно, если он открыт, забивал туда новые значения, а затем вновь открывал. Так что с этим проблем возникнуть, вроде как е должно
6 фев в 17:45
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Описание необходимых действий Но все эти действия необходимо проводить на каждом компьютере, где Вы хотите настроить такую интеграцию. Это конечно значительно сужает область применения. Но более простого способа я не нашел (когда мне необходимо было решить подобную задачу). Либо, как вариант скомпилировать .py в .exe, а на кнопку прикрутить vba скрипт типа:
Sub Primer1() Dim myTest myTest = Shell("""С:\folder_script\my_python_script.exe""", vbNormalFocus) End Sub
Отслеживать
ответ дан 6 фев в 15:59
Игорь Крещенников Игорь Крещенников
353 9 9 бронзовых знаков
Нет, это будет всего один файл на общем сервере. Действия всегда будут проводиться только для него и только на одной машине.
6 фев в 17:47
Ну, в таком случае Вы свободны в выборе инструмента 🙂 Проще IMHO скомпилировать скрипт в exe. Потому что наворачивание на excel не всегда стабильно работает.
6 фев в 17:51
Для примера сделал простенькую модель.
- main.py : создает фрейм из массива случайных чисел, записывает в .csv и ждет 2 секунды, имитируя длительные вычисления.
import time import pandas as pd import numpy as np df = pd.DataFrame( ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'], columns=['Месяц']) df[[f'Column_' for i in range(1, 4)]] = np.random.random(12 * 3).reshape(12, 3) df.to_csv(r'c:\test\random_data.csv', decimal=',', sep=';', encoding='windows-1251') time.sleep(2)

- Книга Excel, где на Лист2 импортированы данные из этого .csv через «Данные / Из текстового/ CSV файла» / Загрузить:
- Также на этом листе есть кнопка «Обновить данные», которой назначен макрос RefreshData() , который с помощью WshShell.Exec() запускает и мониторит процесс выполнения python скрипта. По завершении скрипта обновляет ту самую таблицу на Лист2:
Sub RefreshData() py_script_path = """C:\Users\Alex20\PycharmProjects\test\main.py""" py_exe_path = """c:\Users\Alex20\PycharmProjects\test\venv\Scripts\python.exe""" Set WshShell = CreateObject("WScript.Shell") Set WshExec = WshShell.Exec(py_exe_path & " " & py_script_path) Do Status = WshExec.Status Debug.Print "status - " & Status If Status = 1 Then Exit Do Application.Wait Now + TimeSerial(0, 0, 1) DoEvents Loop ThisWorkbook.Sheets("Лист2").ListObjects(1).Refresh ' обновляем таблицу по завершении подготовки данных End Sub

Из небольших неудобств — черное консольное окно на время выполнения соотв. скрипта.
Runscript — утилита для запуска python скриптов
Думаю многим знакома следующая ситуация. В вашем проекте есть различные действия, которые нужно выполнять время от времени. Для каждого действия вы создаёте отдельный скрипт на питоне. Чтобы далеко не лазить, скрипт кладёте в корень проекта. Через некоторое время вся корневая директория проекта замусоривается этими скриптами и вы решаете сложить их в отдельную директорию. Теперь начинаются проблемы. Если указать интерпретатору python путь до скрипта, включающий эту новую директорию, то внутри скрипта не будут работать импорты пакетов, находящися в корне проекта т.к. корня проекта не будет в sys.path. Эту проблему можно решить несколькими способами. Можно изменять sys.path в каждом скрипте, добавляя туда корень проекта. Можно написать утилитку для запуска ваших скриптов, которая будет изменять sys.path перед запуском скрипта или просто будет лежать в корне проекта. Можно ещё что-то придумать. Мне надоело каждый раз изобретать колесо и я создал велосипед runscript на котором с удовольствием катаюсь.
Установить библиотеку можно с помощью pip:
$ pip install runscript
После установки библиотеки runscript, вы получаете в вашей системе новую консольную команду run с помощью которой можно запускать скрипты. По-умолчанию, команда run ищет скрипты в под-каталоге script текущего каталога.
Давайте рассмотрим простой пример. Создадим каталог script. Создадим пустой файл script/__init__.py, превратив этот каталог в python-пакет. Теперь создадим файл script/preved.py со следующим содержимым:
def main(**kwargs): print(‘Preved, medved!’)
Скрипт готов. Теперь мы можем его запустить:
$ run preved
Preved, medved!
Ура! Скрипт работает. Вот собственно и всё, что делает библиотека runscript. Я серьёзно 🙂 Команда run запускает функцию main из файла, имя которого вы ей передали в командной строке. Оказалось, что даже такой простой фунционал очень удобен. Я с удивлением заметил, что пользуюсь утилиткой run в каждом своём проекте т.к. везде есть простенькие скрипты, которые нужно запускать.
Со временем утилита run обросла рядом полезных полезностей, о которых я сейчас расскажу.
Получение параметров через командную строку
Чтобы передать вашему скрипту какие-либо параметры через командную строку, вам нужно описать эти параметры в функции setup_arg_parser внутри вашего скрипта. Эта функция получает на вход объект ArgumentParser, в который вы можете добавить нужные опции. Далее, когда скрипт будет вызван, значения параметров командной строки будут переданы фунции main. Пример скрипта:
def setup_arg_parser(parser): parser.add_argument(‘-w’, ‘--who’, default=’medved’) def main(who, **kwargs): print(‘Preved, <>’.format(who))
$ run preved
Preved, medved
$ run preved -w anti-medved
Preved, anti-medved
Обратите внимание, как фунция main получила параметры командной строки — в виде обычных именованных параметров. Всегда нужно указывать **kwargs т.к. кроме нужных вам параметров, передаются значения всех глобальных для утитилы run параметров (читайте о них ниже).
Активация Django
Если вы пытались использовать фреймворк Django в ваших консольных скриптах, то знаете, что нужно сделать кое-что, иначе ничего не будет. Кое-что заключается в создании environment переменной DJANGO_SETTINGS_MODULE, cодержащей путь до модуля с настройками. Обычно в python скрипт добавляют следующие строки:
import os os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘settings’
Начиная с django 1.7 нужно также выполнить
import django django.setup()
Для того чтобы выполнять автоматически эти действия в скриптах, запускаемых через run, нужно создать в корне проекта файл с именем run.ini, содержащим следующие настройки:
[global] django_settings_module = settings django_setup = yes
Профилирование
Добавив ключик —profile при вызове скрипта, получим файл с результатами профилирования работы нашего скрипта, который можно посмотреть в kcachegrind. Результат сохраняется в каталог var/.prof.out, так что не забудьте создать этот каталог. Также нужно установить модуль pyprof2calltree, который нужен, чтобы сохранить результат профилирования в формате kcachegrind.
$ run preved —profile
Preved, medved
$ ls var/
preved.prof.out
Настройка мест поиска скриптов
По-умолчанию, утилита run ищет скрипт в двух пакетах: grab.script и script. Пакет grab.script добавлен в этот список, потому что во многих проектах парсинга сайтов я запускаю команду crawl из grab.script пакета. Если вам нужно изменить места для поиска скриптов, создайте следующую настройку в run.ini файле:
[global] search_path = package1.script,foo,bar
Теперь если мы выполним команду `run preved`, то утилита run попытается импортировать модуль preved в следующем порядке:
- package1.script.preved
- foo.preved
- bar.preved
Использование lock-файлов
Иногда бывает нужно запретить одновременную работу нескольких экземпляров скрипта. Например, мы вызываем скрипт каждую минуту с помощью cron и хотим не допустить одновременной работы нескольких копий скрипта, что может произойти, если работа одной из копий затянется больше, чем на минуту. С помощью опции —lock-key мы можем передать имя lock-файла, который будет создан в каталоге var/run. Например, —lock-key foo приведёт к созданию файла var/run/foo.lock.
Другой способ задать имя lock-файла — создание функции get_lock_key внутри вашего скрипта. Результат её работы будет использован утилитой run, для формирования имени lock-файла. Фунция будет полезна на тот, случай, если вы хотите генерировать имя lock-файла в зависимости от параметров, передаваемых скрипту.
import time def get_lock_key(who, **kwargs): return 'the-<>-lock'.format(who) def setup_arg_parser(parser): parser.add_argument('-w', '--who', default='medved') def main(who, **kwargs): print('Preved, <>'.format(who)) time.sleep(1)
Запускаем одновременно две копии скрипта и видим:
$ run preved -w anti-medved & run preved -w anti-medved
[1] 25277
Trying to lock file: var/run/the-anti-medved-lock.lock
Preved, anti-medved
Trying to lock file: var/run/the-anti-medved-lock.lock
File var/run/the-anti-medved-lock.lock is already locked. Terminating.
[1]+ Done run preved -w anti-medved
Я рассказал об основных возможностях библиотеки runscript. Надеюсь, она окажется вам полезной.
В случае вопросов по поводу работы библиотеки можно всегда посмотреть в исходный код, который на данный момент довольно маленький: github.com/lorien/runscript/blob/master/runscript/cli.py
Запуск python-скрипта с помощью другого python-скрипта
У меня есть два файла python: main.py и test.py Я использую cmd, чтобы запустить каждый из них, у меня получается две консоли, со скриптами, которые работают в фоне(это б оты). Возможно ли, с помощью python, запускать другие python скрипты отдельно? Например, я запускаю start.py, а он запускает main.py и test.py в новых консолях.
Отслеживать
4,278 1 1 золотой знак 25 25 серебряных знаков 33 33 бронзовых знака
задан 21 янв 2022 в 21:31
35 2 2 серебряных знака 6 6 бронзовых знаков
6 ответов 6
Сортировка: Сброс на вариант по умолчанию
попробуй import метода из второго скрипта, и потом вызови этот метод в первом
Отслеживать
ответ дан 22 янв 2022 в 5:45
41 4 4 бронзовых знака
Можно это реализовать с помощью импортов нужных файлов. Для этого файл start.py должен выглядеть так:
import main import test
Отслеживать
ответ дан 22 янв 2022 в 6:20
838 3 3 серебряных знака 12 12 бронзовых знаков
Это не совсем, то что мне нужно. Нужен способ, который позволит запустить новую консоль и запустить в ней нужный скрипт. Я пишу бота, который для управления ПК дистанционно. Бот будет иметь возможность запускать python скрипты, отдельно от себя, как если бы я это сам сделал, открыл консоль и запустил первый скрипт, затем открою новую консоль и запущу второй скрипт и они спокойно работают в фоне
22 янв 2022 в 19:55
Если нужно запустить python скрипт в отдельном окне то можно сделать так:
import os os.system("start cmd /k python test.py")
print('test')
Отслеживать
ответ дан 13 мар 2022 в 15:21
11 1 1 бронзовый знак
exec(open('test.py').read())
print('test')
Отслеживать
ответ дан 22 янв 2022 в 10:06
Андрей Крузлик Андрей Крузлик
1,263 3 3 золотых знака 11 11 серебряных знаков 17 17 бронзовых знаков
Это не совсем, то что мне нужно. Используя данный способ, скрипт запускается в той же консоли. Нужен способ, который позволит запустить новую консоль и запустить в ней нужный скрипт. Я пишу бота, который для управления ПК дистанционно. Бот будет иметь возможность запускать python скрипты, отдельно от себя, как если бы я это сам сделал, открыл консоль и запустил первый скрипт, затем открою новую консоль и запущу второй скрипт и они спокойно работают в фоне.
22 янв 2022 в 19:51
Main.py print('hello') #тут может быть любой код Launcher.py exec(open('Main.py').read())
Отслеживать
ответ дан 31 янв в 18:03
Dragon Samp Dragon Samp
добро пожаловать на stack overflow на русском! пожалуйста, постарайтесь оставлять чуть более развёрнутые ответы. дополнить ответ можно, нажав править
31 янв в 18:24
Возможно ли, с помощью python, запускать другие python скрипты отдельно?
Я думаю, что python-модуль multyprocessing вполне удовлетворит Вашим запросам:
multiprocessing — Process-based parallelism
Introduction
multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency, effectively side-stepping the Global Interpreter Lock by using subprocesses instead of threads. Due to this, the multiprocessing module allows the programmer to fully leverage multiple processors on a given machine. It runs on both Unix and Windows.
Как запустить скрипт с аргументами командной строки Python
Используя модуль sys можно запустить скрипт из консоли передав аргументы. sys.argv будет содержать список всех аргументов, которые были переданы при запуске скрипта. При этом первый элемент списка всегда будет иметь название скрипта.
Пример запуска — python main.py a b с
import sys
print ( sys . argv )
>>> [ ‘main.py’ , ‘a’ , ‘b’ , ‘с’ ]
Время чтение: 1 минуту 2022-04-20
Читайте также
- Как получить хеш строки md5 и SHA1 в Python3
- Как определить свободное место на диске python
- Как отправить push уведомление в Windows с помощью Python
- Как получает IP-адрес по имени домена в Python
- Как создать уникальный идентификатор в Python
- Как объединить словари в python 3.5 и python 3.9
- Как сделать именованные аргументы обязательными в python 3
- Правильное завершение программы на Python 3
Помощь проекту
Если есть возможность — поддержать нас: будем очень признательны. Денежные средства пойдут на дальнейшее развитие проекта!
Python полезное
- Как получить хеш строки md5 и SHA1 в Python3
- Как запустить скрипт с аргументами командной строки Python
- Как определить свободное место на диске python
- Как отправить push уведомление в Windows с помощью Python
- Как получает IP-адрес по имени домена в Python
GitHub Полезное
- Скрипт для быстрой установки WireGuard на сервер
- Rich — модуль для красивого вывода текста в терминал.
- PyWebCopy бесплатный инструмент для копирования веб-сайтов

Автор блога Контакты
Все права защищены!
При копировании материала, ссылка на наш сайт обязательна!
2013-2024 © snippcode.ru