从Python脚本中生成.exe,该脚本使用地理信息系统库,如geopandas、folium



这是一个非常简单和宽泛的问题,我知道,但我的时间很少,所以我必须问。我创建了一个接口来进行一些GIS计算,为此我在后台使用了下面的库。

import osmnx as ox, networkx as nx, geopandas as gpd, pandas as pd
from shapely.geometry import LineString, Point
from fiona.crs import from_epsg
import branca.colormap as cm
import folium
from folium.plugins import MarkerCluster
import pysal as ps

这些用于前端

import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename, asksaveasfilename, 
askdirectory
import backend as bk

我试图使它成为一个可执行程序,我也尝试过PyInstaller,但由于依赖关系,它不起作用。有什么方法可以用PyInstaller来实现吗?或者其他图书馆?或者我该怎么办?

附言:我使用的是python 3.6

第二版:

我尝试了cx_freeze,创建了一个setup.py并构建了它。之后,当我双击程序时,它什么都不做。没有错误消息,什么都没有。我的代码如下:

import cx_Freeze
import sys
import os 
PYTHON_INSTALL_DIR = os.path.dirname(sys.executable)
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')
include_files = [(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll')),
(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll'))]
packages = ["pandas", "numpy", "tkinter", "matplotlib", "osmnx", "networkx",
"geopandas", "shapely", "fiona", "branca", "folium",
"pysal"]
base = None
if sys.platform == "win32":
base = "Win32GUI"
executables = [cx_Freeze.Executable("frontend.py", base=base, icon="transport.ico")]
cx_Freeze.setup(
name = "Network_Analyst",
options = {"build_exe": {"packages":packages,
"include_files":include_files}},
version = "0.01",
description = "Network analyst",
executables = executables
)

我的程序由两个脚本组成,分别是前端和后端。我正在前端部分导入后端,是否应该将其添加到安装代码中的某个位置?还有一件事,我正在开发一个执行这些过程的环境,这对构建设置有影响吗?

我从我的代码中给出一个样本,让你更好地理解:

在前端部分,我将后端称为

import backend as bk

在脚本中:

class Centrality(tk.Frame):
def degree_cent(self):
print("Calculating Degree Centrality")
G = self.findG()
try:
bk.degree_cent(G, self.t3.get("1.0",'end-1c'), self.t2.get("1.0",'end-1c'))
except:
bk.degree_cent(G, self.t3.get("1.0",'end-1c'))

在后台,我不使用OOP,我只编写以下函数:

import osmnx as ox, networkx as nx, geopandas as gpd, pandas as pd
def degree_cent(G, outpath, *args):
G_proj = ox.project_graph(G)    
nodes, edges = ox.graph_to_gdfs(G_proj)
nodes["x"] = nodes["x"].astype(float)
degree_centrality = nx.degree_centrality(G_proj)
degree = gpd.GeoDataFrame(pd.Series(degree_centrality), columns=["degree"])

当我点击可执行程序时,它仍然没有响应。根本没有响应。没有任何windows事件(我已从windows事件查看器中进行了检查)。

就另一个库而言:您可以使用cx_Freeze从Python程序中生成可执行文件。

您可以通过发出命令来安装cx_Freeze

python -m pip install cx_Freeze --upgrade

在终端或命令提示符中。您可以在cx_Freeze条目页面上找到指向cx_Freeze文档和源代码的链接。

要创建可执行文件,您需要为应用程序创建一个设置脚本setup.py,然后发出命令

python setup.py build

你可以在这个问题中找到一个使用tkinter的工作示例

tkinter程序使用cx_Freeze进行编译,但程序不会启动

以及它被接受的答案。它还包含有用的链接。

为了在主脚本中使用pandas,您需要通过添加来修改上面链接的示例的setup.py脚本

packages = ['numpy']

并用替换setup调用中的options自变量

options={'build_exe': {'include_files': include_files, 'packages': packages}}

您可能还需要对正在使用的其他模块(geopandasfolium…)进行进一步调整。如果它不适用于上述示例,请编辑您的问题,并添加您正在使用的setup.py脚本和报告的错误消息以获得进一步帮助。

编辑:

对于cx_Freeze5.1.1版,TCL/TK DLL需要包含在构建目录的lib子目录中。您可以通过将元组(source, destination)传递到include_files列表选项的相应条目来实现这一点:

include_files = [(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll')),
(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll'))]

就后端而言,如果在frontend.py中使用import backend,应该没有问题,cx_Freeze应该正确地冻结它。

最新更新