Как связать две программы python
Уверенное владение 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 .
Давайте посмотрим на то, что мы сделали здесь:
- В первой части мы импортировали pandas , создали список со всеми url-адресами и сгенерировали пустой фрейм данных под названием merger
- Во второй части мы просмотрели каждый элемент списка (url-адрес) в files , чтобы прочитать каждый файл, пропустив первые три строчки ( skiprows = 3 ) и добавив его в объединенный датафрейм( merger ).
- В третьей части мы генерируем новый 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 для следующих задач:
- Автоматизируйте Excel с помощью Python, например, создавая отчеты (другой пример описала выше)
- Напишите макросы на Python и запустите их из Excel, нажав на кнопку
- Напишите пользовательские функции в 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() , а остальные модули сами по себе ничего не должны выполнять, они должны только предоставлять ресурсы (классы и функции).
С учётом вышесказанного, я бы реализовал всё так:
На самом деле, не самая удачная структура, но это максимально соответствует вашему вопросу.
Читайте также: