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