Как связать две программы python

Обновлено: 02.05.2024

Уверенное владение Excel уже принято за норму, чем за исключение. И бизнес зачастую просто ни в каких других программах не работает с цифрами. Открыть excel-файл на телефоне в чате или гугл таблицах (тоже, кстати, отлично работает) намного проще, чем думать как запустить тетрадку jupyter notebook или целую программу на python.

(думается мне, после того как я разберусь с excel, напишу еще и про google sheets)

Ну, jupyter notebook это не та программа для телефона, скажете вы. Да, и вы правы, только наш бизнес сейчас весь на телефонах и совещаниях. Начальнику нужно быстренько взять открыть файл, сделать скрин и так далее.

И вот проходя множество курсов по анализу данных вы вряд ли найдете помимо экскурса в Python и SQL еще и Excel — все так стремительно хотят от него уйти, будто вы и так в нём хорошо работали.

Пока я училась поняла, что мало кто из студентов вообще понимает прелесть Excel. Они просто думают, что за Python будущее. Прежде чем мы действительно будем так думать, давайте разберемся с Excel.

Excel сейчас — это стандартная программа, которая ставится в комплекте Microsoft Office и есть на каждом ноутбуке (если её нет, найдется Libre, но смысл останется).

Там удобно посмотреть данные сразу, прокрутить, вставить один раз формулу и “протянуть” дальше. Построить быстренько несложные диаграммы из самостоятельно выбранных данных.

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

Excel локальный, ему не нужен выход в интернет. Вы не пытаетесь вслепую прописать колонки, а сразу видите их вместе. Быстро их фильтруете, или с помощью условного форматирования быстренько обрабатываете данные как необходимо.

Но бывает и такое, что ты сидишь и думаешь “это можно сделать проще”, но, увы, не знаешь как.

Все эти “можно сделать проще” возможны с помощью макросов или power query, но это может быть слишком сложно или наоборот долго, ну, и я зачем мы владеем python? 😃

Прежде чем мы перейдем к конкретной задаче, расскажу, что в Python с excel-документами можно и нужно работать с помощью pandas, openpyxl, xlrd, xlutils и pyexcel.


Друзья, обращаю ваше внимание, что в тексте приведен код для тех, у кого Excel на английском языке. В части с установкой xlwings я постаралась дать скриншоты и с русской версии. Но если у вас Excel на русском языке, пожалуйста, пишите формулы в скриптах на русском :)

Объединение нескольких excel-файлов

Да, эту задачу можно решить ручками или power query, где несколько таблиц передаете в запрос и объединяете.

Например, на работе вы можете работать с ежемесячными отчётами о продажах, и с 90% вероятностью вы будете заниматься консолидацией региональных отчётов. Однажды вас попросят подготовить не только сконсолидированный отчёт, но и найти/подсчитать общее количество продаж по всем этим отчетам — и всё как можно быстрее.

Вариант номер 1, описан выше. Excel, Power Query, добавляете отчёты, объединяете, открываете, смотрите.

Вариант номер 2. Excel, несколько таблиц, переносим вкладки в один документ, создаете еще одну вкладку с шаблоном, делаете подсчёты с помощью формул. Смотрите.

А можно Вариант номер 3. Объединить все excel-файлы в python, используя библиотеку pandas (да-да, pandas).

Устанавливаем pandas используя pip или conda в терминале:


И рассмотрим вариант работы с отчетом, который сделан по одному шаблону (например, придумаем самый простеньких отчёт о продажах фруктов).

Можно заметить, что наш отчёт начинается не с первой ячейки, а только с 4-й строчки, поэтому нам понадобятся данные для импорта, начиная с этой строки (мне кажется, здорово такоё вариант учесть, потому что в работе часто такое встречается). В приведенном ниже коде мы будем использовать функции read_excel и append .

Давайте посмотрим на то, что мы сделали здесь:

  1. В первой части мы импортировали pandas , создали список со всеми url-адресами и сгенерировали пустой фрейм данных под названием merger
  2. Во второй части мы просмотрели каждый элемент списка (url-адрес) в files , чтобы прочитать каждый файл, пропустив первые три строчки ( skiprows = 3 ) и добавив его в объединенный датафрейм( merger ).
  3. В третьей части мы генерируем новый excel-файл с именем merger.xlsx , содержащий наши объединенные файлы!

Получение значений нескольких файлов

Давайте посмотрим на другой пример.

Скажем, нам нужно было получить итого только по Москве из каждого отчета о продажах и собрать их в список. Мы знаем, что сумма сохраняется в ячейке F5 в каждой книге.

Для этого примера мы будем использовать другую библиотеку — openpyxl . Вы можете установить её с помощью pip или conda, используя код ниже:

А теперь посмотрим код и что он выполняет:

Если вы хотите выполнить код ниже, то запускайте код после сохранения файлов, сохраните файлы по ссылкам выше на свой компьютер.

Давайте разберем это шаг за шагом, сначала мы:

  • Создаем список ( files ), который содержит ссылки на все наши файлы. В Windows мы можем нажать Shift + правой кнопкой мыши и использовать Копировать как путь (или, Copy as Path), чтобы получить путь к файлу.
  • И создаем пустой список для хранения наших значений ( values )
  • Пишем цикл, который будет выполнять нужные нам манипуляции с каждым файлом:

— с помощью метода .load_workbook() загружаем файл

— используем ['Sheet1'] и ['F5'] для ссылки на имя листа, так и на ссылки на ячейки таблицы (на нужном нам листе в рабочей книге)

Если у вас Excel на русском языке, то вместо 'Sheet1' указывайте 'Лист1' .

— и используем атрибут .value , чтобы извлечь значение ячейки и добавить его в список values методом .append()

Применение формул в книгах

В каждом из excel-файлов у нас есть итоги по строкам, но это не общая сумма продаж. Опять же, мы можем открыть каждую книгу и добавить формулу ручками, или мы можем использовать python, чтобы сделать это для нас.

Мы снова будем использовать openpyxl . Если вам нужно установить его, сделайте это по инструкции выше.

  • В этом фрагменте кода мы снова заполняем список файлов. Цикл for открывает каждый файл и присваивает соответствующее название листа.
  • Затем мы присваиваем строку = SUM(F5: F8) ячейке F9 и используем атрибут style для назначения стиля ячейки. Больше стилей ячеек можно найти в официальной документации.

Если у вас Excel на русском языке, то вместо 'Sheet1' указывайте 'Лист1' и записывайте формулы соответственно на русском, например, =СУММ(F5:F8) .

А теперь я дополню эту связку, вот таким вот открытием — автоматизировать Excel, и по сути заменить VBA (в моём понимании) можно библиотекой xlwings.

Автор xlwings говорит, что библиотека “Make Excel Fly!”. Вы можете использовать xlwings + Python для следующих задач:

  1. Автоматизируйте Excel с помощью Python, например, создавая отчеты (другой пример описала выше)
  2. Напишите макросы на Python и запустите их из Excel, нажав на кнопку
  3. Напишите пользовательские функции в Python и вызовите эти функции из Excel так же, как и любую другую функцию Excel

Попробуем установить и рассмотреть несложный первый пункт. Пункты 2 и 3 рассмотрим в следующей серии.

Существует две части для установки xlwings: библиотека Python и надстройка Excel. Давайте начнем с установки библиотеки Python через командную строку:


Затем загрузите надстройку Excel из официального репозитория xlwings на Github. Это xlwings.xlam файл на странице (если вы вдруг будете читать эту статью через год, берите последнюю версию)

Положите xlwings.xlam-файл в папку надстройки Excel, которая является:

C:\Users\xxxx\AppData\Roaming\Microsoft\AddIns

Xxxx — это ваше собственное имя пользователя на вашем компьютере.

У меня получилось так, что я могу сейчас показать как это работает в английской и в русской версии Excel.

Затем откройте Excel, Файл -> Параметры -> Надстройки (или File -> Options -> Add-ins), нажимаем кнопку “Перейти..” (Go..) выбирая Надстройки Excel (Excel Add-ins).


Когда появится окно надстроек, нажмите на кнопку “Обзор” (Browse..).

Это приведет вас непосредственно к папке Addins (куда вы добавили файл), просто выберите xlwings.xlam файл из папки и нажмите кнопку “ОК”. Надстройка xlwings теперь добавлена в ваш Excel, она будет автоматически включена всякий раз, когда вы запускаете приложение Excel.


Теперь вкладка xlwings должна появиться на ленте Excel.


На этом настройка завершена!

С интерпретатором кода Python можно работать через командную строку/терминал. Если в консоли выполнить команду python (или python3 , в зависимости от того как у вас настроено) без параметров, то интерпретатор Python запустится здесь и сейчас.

Теперь можно вводить в командную строку любые скрипты python — и они будут выполняться прямо в терминале. Это похоже на работу командной строки, но вместо команд для работы с файлами выполняется программный код, строчка за строчкой.

Символы >>> — это приглашение для ввода команд, то же, что и знак в командной строке.


Запустите следующий скрипт Python, который откроет новый экземпляр Excel.

Затем у вас откроется новый файл.

Здесь, wb относится к новому (и открытому) файлу Excel, и это также объект Python в то же время, что означает, что мы можем манипулировать им (файлом Excel) в Python!

Попробуйте следующий код, который позволит вам вводить значения из Python в Excel.

Если у вас Excel на русском языке, то вместо 'Sheet1' указывайте 'Лист1' .

Мы также будем использовать .range((x,y)) для обозначения отдельных ячеек в Excel. Где x относится к строке, а y относится к столбцу.

Так .range((3, 2)) значит клетка B3 (это на случай если вы отключили стиль ссылок R1C1) или R3C2.

Кроме того, можно писать формулы в Excel с помощью Python. В основном мы записываем строку в ячейку. Здесь мы хотим вычислить экспоненциальные значения оси x в другом столбце. В приведенном ниже коде мы используем “f-string”, который является улучшенным синтаксисом форматирования строк, начиная с Python 3.6.

Сохранение данных из Excel в датафрейм так же просто, как и само создание документа выше. Прочитаем данные Excel в Python в виде списка.

Попробуйте следующий код, если вы хотите прочитать данные excel в python в pandas виде датафрейма. .expand() автоматически определяет размер данных и .options() указывает, что нам нужен pandas .

Мы сбрасываем индекс в конце, так что ось x будет рассматриваться как столбец, а не в качестве индекса.

Теперь можно построить и график! Поскольку данные уже в python, мы можем создать график, а затем поместить его в excel-файл.

Для построения графика мы будем использовать matplotlib .

Собственно как и всегда, мы должны сохранить и закрыть файл! Вспоминаем, что wb относится к рабочей книге.

В заключение

Python делает работу с excel-файлами довольно простой. Мы рассмотрели, как объединять различные excel-файлы, получать конкретные значения и добавлять формулы сразу в несколько файлов одновременно, а также поставили надстройку в excel и попробовали создать простенький файл.

Несмотря на то, что на работе порой вы можете застрять в excel на целый день, а то и вся рутина у вас в нём, python поможет автоматизировать какие-нибудь простенькие задачки (для начала).

В следующий раз постараюсь разобраться с вами как работать с VBA и писать функции в Python, а затем пользоваться ими в excel.

Как я могу запустить несколько скриптов Python? В данный момент я запускаю такой как python script1.py .

Я пробовал python script1.py script2.py , и это не работает: запускается только первый скрипт. Кроме того, я попытался использовать один файл, как это;

Однако это тоже не работает.

Вот и весь сценарий. Он будет запускать два скрипта Python одновременно.

Python мог бы сделать то же самое сам, но это заняло бы намного больше времени, и это плохой выбор для рассматриваемой проблемы.

Я думаю, что возможно, что вы используете неправильный подход к решению вашей проблемы, и я хотел бы услышать, к чему вы клоните.

Я должен был сделать это и использовал подпроцесс.

Если вы хотите запустить два скрипта Python параллельно, просто включите следующее в конец скрипта:

На мой взгляд, самым простым способом было бы использовать PyCharm IDE и установить плагин 'multirun'. Я попробовал много решений здесь, но это сработало для меня в конце концов!

Я делаю это в node.js (в Windows 10), открывая 2 отдельных экземпляра cmd и запуская каждую программу в каждом экземпляре.

Это имеет то преимущество, что запись в консоль легко видна для каждого сценария.

Я вижу, что в Python можно сделать то же самое: 2 оболочки.

Вы можете запустить несколько экземпляров оболочки IDLE / Python одновременно. Так что откройте IDLE и запустите код сервера, а затем снова откройте IDLE, который запустит отдельный экземпляр и затем запустит ваш клиентский код.

Я работаю в Windows 7 с Python IDLE. У меня есть две программы,

Я открываю IDLE, а затем открываю файл progA.py. Я запускаю программу, и когда мне предлагают ввести данные, я ввожу "b" + , а затем "c" +

Я смотрю на это окно:

Затем я возвращаюсь в Windows Start и снова открываю IDLE, на этот раз открывая файл progB.py. Я запускаю программу, и когда мне предлагают ввести данные, я ввожу "x" + , а затем "y" +

Я смотрю на это окно:

Теперь две программы оболочки IDLE Python 3.6.3 работают одновременно, одна оболочка работает под управлением progA, а другая - под управлением progB.

Самое простое решение для одновременного запуска двух процессов Python - это запустить их из файла bash и указать каждому процессу перейти в фоновый режим с помощью оператора оболочки & .

Для более контролируемого способа параллельного запуска многих процессов перейдите в проект Supervisor или воспользуйтесь модуль многопроцессорной обработки для организации внутри Python.

Вы можете использовать Gnu-Parallel для одновременного запуска команд, работает в Windows, Linux / Unix .

Поэтому у меня есть несколько файлов Python, каждый из которых представляет собой свое собственное консольное приложение, предоставляющее пользователю несколько вариантов. file1.py, file2.py, file3.py и т. д.

У меня есть другой файл с именем menu.py. В этом файле я хочу предложить пользователю возможность запустить один из других файлов python, т.е.

Мой код будет намного чище, но, надеюсь, вы понимаете, к чему я стремлюсь.

4 ответа

Я полагаю, что вы ищете os.system()

Вы можете запустить команду

Добавляем к ответу Джоша.

Для наиболее чистого решения вы должны использовать операторы import для извлечения кода из другого файла. Способ достижения этого заключается в том, чтобы каждый файл имел основную функцию, которая будет служить интерфейсом. Кроме того, я также рекомендую использовать argparse, если файлы являются программами командной строки.

Если за один раз вызывается только один файл, программа может выглядеть примерно так:

file1.py может выглядеть так:

И вы называете это так: python3 menu.py --file file1 --options option1 option2

Этот ответ приписывается @balpha и @fantastory.
Если вы используете Python 2, используйте

Если вы используете Python 3, используйте

Вы также можете посмотреть документы о том, как обрабатываются пространства имен.

Создаю приложение и решил его делать частями, то есть одна часть приложения в одном коде, другая часть приложения в другом.

Первый файл является главным, второй файл - файлом, который нужно вставить в первый.
Проблема в том, что второй файл делался с помощью Qt Designer и имеет отсылки к .ui файлам, не знаю как это правильно соединить.

Вот главный код, в который надо вставить другой код (в 2 страницу):

Вот код, который надо вставить:

Вот ссылка на диск с .ui файлами Яндекс Диск

1 ответ 1

Позволю дать вам некоторые советы:

хотя ваш вопрос звучит как: 'Соединение двух проектов с расширением .py', я понял что вам надо вставить виджет App из втогого файла как страницу (например четвертую) в основное приложение main.py .

ваше основное приложение main.py - содержало много ошибок. Я исправил их, смотрите по тексту кода.

НЕТ проблемы в том, что второй файл делался с помощью Qt Designer и имеет отсылки к .ui файлам.

я не могу проверить правильно ли работает ваш второй файл, поэтому я заменил его каким-то своим q1297974_second.py.

Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 2 года назад .

Есть класс с GUI, где GUI помогает отображать tkinter и есть класс логики. т.е. на выходе имеем.

Как бы я не пытался сделать что-то типа design -> main -> design постоянно вылазят ошибки, то импорта то еще чего-нибудь.

Может, кто нибудь написать, как правильно элементарно с Enrty() передать информацию в main, там ее обработать любым методом и вернуть обратно в design в какую-нибудь Label.

Или это возможно только design - > main (сохраняем результат в файл) -> design (читаем файл)

Извиняюсь да, перепутал. Мне нужно, как то с одного модуля, передать информацию другому и вернуть ее первому.

Ещё раз повторюсь: данные между модулями не передаются. Напишите ваш код, чтобы было понятно, что именно вы хотите сделать.

1 ответ 1

На самом деле, в вашем коде проблема не с "передачей значения из класса в класс", а несколько других проблем разной степени серьёзности.

Тут у вас опечатка в слове tkinter , будет ошибка импорта

Тут вы, очевидно, хотели написать window = Tk()

Опечатка в слове geometry

Так делать нельзя. Если переменная объявлена вне функции, то нельзя просто так взять и записать в неё значение внутри функции. Это ограничение можно обойти с помощью ключевого лова global . Но лучше этого не делать, т.к. в 95% случаев использование global означает, что выбрано неудачное решение.

Пропущено def перед __init__ . Ну и если у вас метод __init__ пустой, то он вообще не нужен.

Кроме того, у вас перекрёстный импорт - в main вы импортируете design , а в design - импортируете main . Так делать не надо.

На самом деле, структура вашей программы плохо продумана. Должен быть один главный запускаемый файл, в котором должен запускаться window.mainloop() , а остальные модули сами по себе ничего не должны выполнять, они должны только предоставлять ресурсы (классы и функции).

С учётом вышесказанного, я бы реализовал всё так:

На самом деле, не самая удачная структура, но это максимально соответствует вашему вопросу.

Читайте также: