从使用 GIS 库(如 geopandas、folium)的 Python 脚本制作 .exe

Posted

技术标签:

【中文标题】从使用 GIS 库(如 geopandas、folium)的 Python 脚本制作 .exe【英文标题】:Making .exe from the Python Script that uses GIS libraries such as geopandas, folium 【发布时间】:2019-01-17 07:33:17 【问题描述】:

我知道这是一个非常简单和广泛的问题,但我没有多少时间,所以我不得不问。我创建了一个接口来进行一些 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有什么办法吗?或任何其他图书馆?或者我该怎么办?

ps:我使用的是 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 事件查看器中检查过)。

【问题讨论】:

我也有同样的问题,好像是包装fiona的问题。如果您从 CMD 行运行生成的 EXE,似乎为 fiona 导入 DLL 存在问题 【参考方案1】:

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

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

python -m pip install cx_Freeze --upgrade

在终端或命令提示符下。您可以在 cx_Freeze entry page 上找到指向 cx_Freeze 文档和源代码的链接。

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

python setup.py build

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

tkinter program compiles with cx_Freeze but program will not launch

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

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

packages = ['numpy']

并将setup 调用中的options 参数替换为

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

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

编辑:

对于cx_Freeze 5.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应该可以正确冻结。

【讨论】:

我已根据您的评论更新了我的问题!谢谢 @omrakn 您使用的是哪个版本的cx_Freeze?您是否还需要将后端脚本作为独立的可执行文件运行? cx_freeze 版本为 5.1.1。是的,我需要它们是同一个文件夹来执行我的前端。 @omrakn 我已经编辑了 cx_Freeze 5.1.1 的答案。它仍然不完全了解后端是如何启动的,如果您仍然有问题,请从您的前端添加一段代码来启动后端到您的问题。 首先感谢您的关注。我已经改变了我的 setup.py 就像你说的,但它仍然没有响应。我已经编辑了我的帖子,并从我的后端和前端添加了一些代码 sn-p 以使您更好地理解。

以上是关于从使用 GIS 库(如 geopandas、folium)的 Python 脚本制作 .exe的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib+cartopy+geopandas,实现专业地图可视化!

matplotlib+cartopy+geopandas,实现专业地图可视化!

matplotlib+cartopy+geopandas,实现专业地图可视化!

matplotlib+cartopy+geopandas,实现专业地图可视化!

windows下安装geopandas

GeoPandas安装保姆级教程