问题描述
我在使用 cx_Freeze 和 winpython 时遇到了一些问题。
由于我需要冻结 python 脚本,我尝试使用 cx_Freeze(在这种情况下 pyinstaller 不起作用)。
这里是脚本:
from tkinter import *
from tkinter import ttk
from tkinter.messageBox import showinfo
from bromseButton import FolderSelect,FileSelect
import pandas as pd
from Version import Version
import ezdxf
# version du script :
version = "V0.1.2"
nom_script = "bornes"
#Vérification de la version avec la classe Version
v = Version(version,nom_script)
v.return_message()
#création de la fenêtre principale
fen = Tk()
fen.geometry("710x180")
fen.title("Insertion de bornes dans un fichier dxf - " + version + " "+ v.message)
fen.iconbitmap("index.ico")
#Placement des cadres pour structurer la fenêtre
f1=Frame(fen,bd = 1,width = 900,height= 150,bg='#ddddDD',relief='ridge')
f1.grid(row = 0,column = 0,rowspan = 2)
f2=Text(fen,width = 20,height= 5,relief='ridge')
f2.grid(row=2,columnspan=1,padx=4,sticky = (NSEW))
yscrollbartext=ttk.Scrollbar(fen,orient=VERTICAL,command=f2.yview)
yscrollbartext.grid(row=2,sticky=(NS,E))
f2["yscrollcommand"]=yscrollbartext.set
doc46 = ezdxf.readfile("GABARITS/Gabarit_46.dxf")
#####################################################
# Création d'une fenêtre d'impression des versions #
#####################################################
f2.tag_configure('big',font=('Arial',9,'bold'))
f2.tag_configure('versionnok','bold'),foreground="red")
f2.tag_configure('versionok',foreground="green")
# affichage de l'historique des versions
f2.insert(END,"Historique des versions \n\n",'big')
j=0
for i in reversed(sorted(list(v.scripts["versions"].keys()))) :
if j ==0 :
if i==version :
f2.insert(END,i +"\n",'versionok')
f2.insert(END,v.scripts["versions"][i]["date"]+"\n",'versionok' )
f2.insert(END,v.scripts["versions"][i]["description"]+"\n\n",'versionok' )
else :
f2.insert(END,'versionnok' )
f2.insert(END,v.scripts["versions"][i]["date"] + "\n",'versionnok' )
j+=1
else :
if i==version :
f2.insert(END,'big')
f2.insert(END,'big' )
f2.insert(END,'big' )
else :
f2.insert(END,i +"\n")
f2.insert(END,v.scripts["versions"][i]["date"] + "\n")
f2.insert(END,v.scripts["versions"][i]["description"]+"\n\n")
def action() :
csv = csv_bornes.file_path
rep = dest_shp.folder_path
insert_borne(csv,rep)
showinfo(title="résultat final",message="Insertion des bornes terminées")
def insert_borne(csv,rep):
msp = doc46.modelspace()
df = pd.read_csv(csv,delimiter=';')
for i in df.index :
if df['BLOC'][i] =='46_POINT_NUMERIQUE' :
borne = msp.add_blockref(df['BLOC'][i],(df['X'][i],df['Y'][i]),dxfattribs={'layer' : 'BOR_Pt_Numerique'})
else :
borne = msp.add_blockref(df['BLOC'][i],dxfattribs={'layer' : 'BOR_Pt_Materialise'})
borne.add_attrib('NumeroPoint',df['NumeroPoint'][i],(df['X'][i]+6.61,df['Y'][i]+11.18),dxfattribs={'height':5,'layer':'TXT_Borne'})
doc46.saveas(rep + "/bornes.dxf")
############################
# Récupération des données #
############################
# répertoire de destination pour les fichiers shp temp
dest_shp = FolderSelect(f1,"Répertoire de destination du dxf : ")
dest_shp.grid(row = 0,column = 0)
#Fichier csv
csv_bornes = FileSelect(f1,"Fichier csv : ",[("Fichiers csv","*.csv")])
csv_bornes.grid(row = 1,column = 0)
#bouton de lancement de la fonction principale :
valider = Button(fen,text = "Exécuter",command = action)
valider.grid(row = 6,sticky = (NW))
fen.mainloop()
和 setup.py :
import sys
from cx_Freeze import setup,Executable
import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR,'tcl','tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR,'tk8.6')
# Dependencies are automatically detected,but it might need fine tuning.
build_exe_options = {"packages": ["os","numpy","pandas","ezdxf"],'include_files':[
os.path.join(PYTHON_INSTALL_DIR,'DLLs','tk86t.dll'),os.path.join(PYTHON_INSTALL_DIR,'tcl86t.dll'),os.path.join(os.getcwd(),'GABARITS/Gabarit_46.dxf'),'index.ico')]
}
base = None
if sys.platform == "win32":
base = "win32gui"
setup(
name = "bornes",version = "0.1.2",description = "Bornes!",options = {"build_exe": build_exe_options},executables = [Executable("test.py",base=base,icon ='index.ico')]
)
第一次尝试:
带有 cx_Freeze 6.1 的 winpython 3.7.7。它没有用。 所以我一步一步地尝试发现问题出在熊猫库上。 搜索响应我尝试将 'build_exe': './/build' 放在选项中。创建没问题,但单击 exe 文件时没有附加任何内容。
第二次尝试:
使用 python 3.8.6(官方发行版): 将 cx_Freeze 升级到 6.6 一切正常! exe 文件正在运行。好的,我只需要升级 winpython 的 cx_Freeze 版本,一切都会好起来的...但是没有...
我不知道为什么,但我遇到了递归错误:
File "C:\Users\bruno\Documents\WPy64-3940\scripts\setup.py",line 83,in <module>
setup(
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\site-packages\cx_Freeze\dist.py",line 397,in setup
distutils.core.setup(**attrs)
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\distutils\core.py",line 148,in setup
dist.run_commands()
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\distutils\dist.py",line 966,in run_commands
self.run_command(cmd)
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\distutils\dist.py",line 985,in run_command
cmd_obj.run()
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\distutils\command\build.py",line 135,in run
self.run_command(cmd_name)
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\distutils\cmd.py",line 313,in run_command
self.distribution.run_command(command)
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\distutils\dist.py",in run_command
cmd_obj.run()
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\site-packages\cx_Freeze\dist.py",line 265,in run
freezer.Freeze()
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\site-packages\cx_Freeze\freezer.py",line 795,in Freeze
self.finder: ModuleFinder = self._GetModuleFinder()
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\site-packages\cx_Freeze\freezer.py",line 464,in _GetModuleFinder
finder = ModuleFinder(
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\site-packages\cx_Freeze\finder.py",line 70,in __init__
self._add_base_modules()
File "C:\Users\bruno\Documents\WPy64-3940\python-3.9.4.amd64\lib\site-packages\cx_Freeze\finder.py",line 82,in _add_base_modules
[...]
File "<frozen importlib._bootstrap_external>",line 853,in source_to_code
File "<frozen importlib._bootstrap>",line 228,in _call_with_frames_removed
RecursionError: maximum recursion depth exceeded during compilation
我已经尝试过 winpython 3.8、3.9,同样的问题...
这是 winpython 的一个已知问题吗?如果有人帮助我,那就太好了!
再见!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)