Как обернуть код на питонее в доступную оболчку
Всем привет, у меня есть написаный на питоне код о сравнении 2х файлов эксель, теперь мне нужно сделать его доступным для человека, не умеющего работать с JupyterNotebook. Хотелось бы отделаться малой кровью и сделать это наиболее простым образом(без написания фронтенда в привычном образе). Кто-то может подсказать план действий?
От пользователя требуется только загрузить файлы эксель и на выходе нужно получить файл эксель со сравнением. Пока что есть одна идея сделать это с помощью flask. Но я не уверена, что это наилучший путь.
Ответы (3 шт):
Ну если человеку код нужен просто в пользование, то я бы просто все обернул в функции, которые потом достаточно было бы вызвать с нужными входными данными. Если же ему нужно дальше развивать, то проще уж ему будет вкурить в Jupiter, не так он и сложен. Нельзя же сделать понятной программу, если человек не понимает ее основного инструмента.
мне кажется проще сделать через cgi, примерно так, тремя файлами
test_dir/start_http_server.py - запуск http сервера
import http.server
httpd = http.server.ThreadingHTTPServer(('192.168.1.1', 80), http.server.CGIHTTPRequestHandler)
httpd.serve_forever() # http://192.168.1.1:80
test_dir/cgi-bin/index.html - стартовая страница, с формой загрузки файлов
<!DOCTYPE html>
<html>
<form enctype="multipart/form-data" action="upload_file.py" method="post">
<p>File: <input type="upload_file" name="upload_file"></p>
<p><input type="submit" value="upload_file"></p>
</form>
</html>
test_dir/cgi-bin/upload_file.py - сравнение файлов и выгрузка файла клиенту, запускается кнопкой субмит на стартовой странице
import cgi
def main(file_path):
"""код о сравнении 2х файлов эксел"""
result_file_link = '...'
return result_file_link
if __name__ == '__main__':
# получение исходного файла
form = cgi.FieldStorage()
file_1 = form['upload_file']
# получение файла результата
result_file_link = main(file_1.filename)
# передача файла результата, то что выведет print, попадет клиенту в браузер
print(f'''
Content-Type: application/octet-stream; name="{result_file_link}"
Content-Disposition: attachment; filename="{result_file_link}"
Content-Length: " + {os.stat(result_file_link).st_size}
{open(result_file_link, 'rb').read()}
''')
Если вы можете установить Питон на компьютер пользователя, то этот скрипт попросит пользователя выбрать три файла и выполнит работу над ними. В данном случае он склеивает первые два файла и записывает их в третий:
import tkinter.filedialog
def process(filename_1, filename_2, filename_3):
with open(filename_3, 'w') as f3:
with open(filename_1) as f1:
for line in f1:
print(line, end='', file=f3)
with open(filename_2) as f2:
for line in f2:
print(line, end='', file=f3)
def main():
filename_1 = tkinter.filedialog.askopenfilename(title='Select first file')
if not isinstance(filename_1, str):
return
filename_2 = tkinter.filedialog.askopenfilename(title='Select second file')
if not isinstance(filename_2, str):
return
filename_3 = tkinter.filedialog.asksaveasfilename(title='Select file for result')
if not isinstance(filename_3, str):
return
process(filename_1, filename_2, filename_3)
main()