#python #cx-freeze
#питон #cx-замораживание
Вопрос:
Мне нужно отправить некоторый код Python в виде исполняемого файла моим коллегам (у которых нет интерпретаторов на своих компьютерах) по нашей сети, поэтому я работаю над изучением cx_freeze. Гигантские файлы, созданные pyinstaller, не собирались сокращать его при экономии сетевого пространства. С помощью setup.py файл ниже, у меня не было проблем с созданием папки сборки, и EXE-файл отлично работает на моем компьютере:
from cx_Freeze import setup, Executable
setup(name = "reandurllib" ,
version = "0.1" ,
description = "" ,
executables = [Executable("LossChecker.py")])
Я извлек папку из папки сборки, назвал ее LossChecker и скопировал ее в нашу сеть. К сожалению, когда мои коллеги пытаются ее использовать, ничего не происходит. Когда я пытаюсь открыть ее в сети, я получаю пустое окно командной строки. Если я скопирую папку из сети обратно на свой компьютер, она будет работать нормально, но если это сделает коллега, программа по-прежнему не откроется для них.
Я предполагаю, что проблема здесь в сети. Если это так, как лучше всего поделиться папкой? Будет ли работать архивирование и отправка по электронной почте? Есть ли исправление, которое я могу сделать со своей стороны, чтобы предотвратить проблему в первую очередь? Спасибо за помощь.
Редактировать: в случае, если это применимо, вот код для базовой программы:
import pandas as pd
import numpy as np
import tkinter as tk
from tkinter import simpledialog
from tkinter import filedialog
import webbrowser
from tempfile import NamedTemporaryFile
top = tk.Tk()
top.title('Loss Checker')
my_filetypes = [('csv files', '.csv')]
base_html = """
<!doctype html>
<html><head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.css">
<script type="text/javascript" src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.js"></script>
</head><body>%s<script type="text/javascript">$(document).ready(function(){$('table').DataTable({
"pageLength": 50
});});</script>
</body></html>
"""
def df_html(df):
df_html = df.to_html()
return (base_html % df_html).encode('ascii')
def df_window(df):
with NamedTemporaryFile(delete=False, suffix='.html') as f:
f.write(df_html(df))
webbrowser.open(f.name)
def loadnew():
global newpath
global new
newpath=filedialog.askopenfilename(parent=top,initialdir="/",title="New Losses")
new=pd.read_excel(newpath,sheet_name=None,usecols=['claim','paid','reserved','incurred','py','lob'])
def loadold():
global oldpath
global old
oldpath=filedialog.askopenfilename(parent=top,initialdir="/",title="Old Losses")
old=pd.read_excel(oldpath,sheet_name=None,usecols=['claim','paid','reserved','incurred','py','lob'])
def check(new,old,dif,kind):
global output
output=pd.DataFrame()
for key in new.keys():
tempnew=new[key]
tempnew=tempnew[['claim','paid','reserved','incurred']].groupby(by='claim').sum().merge(tempnew[['claim','py','lob']].drop_duplicates(subset='claim', keep="first"),how='left',on='claim')
tempold=old[key]
tempold=tempold[['claim','paid','reserved','incurred']].groupby(by='claim').sum().merge(tempold[['claim','py','lob']].drop_duplicates(subset='claim', keep="first"),how='left',on='claim')
comb=tempnew.merge(tempold,how='outer',on='claim',suffixes=['_new','_old'],indicator=True)
comb['program']=key
comb['Status']=comb['_merge'].replace({'both':'Recurring','left_only':'New','right_only':'Missing'})
comb['difference']=comb['incurred_new']-comb['incurred_old']
comb=comb[['program','claim','Status','difference'] comb.columns[1:-4].to_list()].fillna(0)
comb['difference']=comb['incurred_new']-comb['incurred_old']
if kind==True:
output=output.append(comb[comb['difference']>dif])
else:
output=output.append(comb[comb['difference']<dif])
output.drop(columns=['py_old','lob_old'],inplace=True)
output['py_new']=output['py_new'].astype(int)
if kind==True:
output=output.sort_values(by='difference',ascending=False).reset_index()
else:
output=output.sort_values(by='difference').reset_index()
output.rename(columns={'difference':'Incurred Development','py_new':'PY','lob_new':'LOB'},inplace=True)
output.columns=output.columns.str.title().to_list()
output.drop(columns=['Index'],inplace=True)
df_window(output)
def save(df):
save=filedialog.asksaveasfilename(parent=top,initialdir="/",title="Save As",filetypes=my_filetypes)
df.to_csv(save)
w=tk.Button(top,text="Load New Losses",command=loadnew)
w.grid(row=0,column=1)
w2=tk.Button(top,text="Load Old Losses",command=loadold)
w2.grid(row=0,column=2)
w3=tk.Button(top,text='Greater than',command=lambda:check(new,old,int(e1.get()),True))
w3.grid(row=2,column=1)
w4=tk.Button(top,text='Less than',command=lambda:check(new,old,int(e1.get()),False))
w4.grid(row=2,column=2)
w5=tk.Button(top,text='Save',command=lambda:save(output))
w5.grid(row=3,column=1)
tk.Label(top, text="Incurred Development").grid(row=1)
e1 = tk.Entry(top)
e1.grid(row=1, column=1)
top.mainloop()
Комментарии:
1. Может ли это быть проблемой с путем? Есть ли у вас какие-либо пути в вашем файле python? Также cx_freeze и friends сложно отлаживать. Может быть, попробовать: за исключением вашего основного и распечатать содержимое в файл?
2. Как ты бегаешь setup.py ? это что setup.py строить? Также какую версию numpy вы используете?
3. Хорошо, итак, мне удалось собрать и запустить его в своей системе без проблем. Я не думаю, что это проблема пути, и я не думаю, что это связано с сетевым диском… единственное отличие сетевого диска заключается в том, что он работает значительно медленнее, чем жесткий диск. Может быть, загрузка занимает слишком много времени? Это должно работать на вашем компьютере. Это может не подействовать на ваших коллег, но, может быть, это другая проблема? Что, если ваши коллеги скопируют его на свой локальный диск, сработает ли это?
4. Numpy 1.19.4. Когда моя коллега копирует папку на свой компьютер (который, за исключением интерпретатора, который у меня есть, фактически идентичен), он не запускается. В настоящее время я копирую ее из сетевой папки на свой рабочий стол, чтобы посмотреть, вызывает ли проблему простая передача ее в сеть и из сети.
5. Я думаю, что это на самом деле библиотеки. Это может быть глупо… У меня были проблемы с этим, когда я впервые запустил его, мне пришлось использовать numpy 1.18.0