Создание .exe из скрипта Python, использующего библиотеки ГИС, такие как геопанда, фолио - PullRequest
0 голосов
/ 17 января 2019

Это очень простой и широкий вопрос, который я знаю, но у меня очень мало времени, поэтому я должен его задать. Я создал интерфейс для выполнения некоторых ГИС-вычислений и для этого использовал следующие библиотеки в бэкэнде.

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? или любые другие библиотеки? Или что мне делать?

p.s: я использую python 3.6

2-е РЕДАКТИРОВАНИЕ:

Я попробовал 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
        )

Моя программа состоит из двух сценариев: внешнего и внутреннего. Я импортирую backend в раздел frontend, я должен добавить его где-нибудь в коде установки? И еще одна вещь, я работаю над средой для выполнения этих процессов. Это влияет на создание установки?

Я даю пример из моего кода, чтобы сделать ваше понимание лучше:

В интерфейсной части я называю бэкэнд как

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'))

В бэкэнде я не использую ООП, я просто пишу такие функции, как:

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 Event Viewer).

1 Ответ

0 голосов
/ 18 января 2019

Что касается другой библиотеки: вы можете использовать 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']

и заменив аргумент options в вызове setup на

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

Вам также может понадобиться дополнительная настройка для других модулей, которые вы используете (geopandas, folium, ...),Если он не работает с примером, описанным выше, отредактируйте ваш вопрос и добавьте используемый вами скрипт setup.py и сообщите об ошибке, чтобы получить дополнительную помощь.

РЕДАКТИРОВАТЬ:

Дляcx_Freeze версия 5.1.1, библиотеки DLL TCL / TK должны быть включены в подкаталог 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'))]

Что касается бэкэнда, если вы используете import backend в frontend.py, это не должно быть проблемой, cx_Freeze должно заморозить его правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...