我刚刚使用Gtk3 for GUI开发了一个Python 2.7应用程序。 我的问题是,我现在如何为Windows,Mac和Linux(可能是三个不同的安装程序)创建一个安装程序,以便我的最终用户轻松下载应用程序,而无需下载python和GTK等。
我之前从未使用python脚本创建过安装程序。我听说有一些工具用于此目的(py2exe?pyinstaller?),但我不知道如何以及如何打包它们以便它能够使用Gtk3。
答案 0 :(得分:9)
在搜索互联网寻找解决方案几天后,我终于偶然发现了this blog-post,这帮助我创建了一个.exe来运行Windows上的程序,这是我的主要目标。
为了将来参考,这些是我采取的步骤:
确保安装了Python,安装了GTK + 3(install from here)和PyGObject(install from here)。 重要:安装PyGObject时,请确保同时选择Gtk + AND Gstreamer(出于某种原因,你必须使用py2exe来获取所有dll)
在与项目相同的目录中,创建一个包含以下脚本的新python文件。确保将'main.py'更改为您自己的主脚本文件的名称(启动您的应用程序的文件):
setup.py :
from distutils.core import setup
import py2exe
import sys, os, site, shutil
site_dir = site.getsitepackages()[1]
include_dll_path = os.path.join(site_dir, "gnome")
gtk_dirs_to_include = ['etc', 'lib\\gtk-3.0', 'lib\\girepository-1.0', 'lib\\gio', 'lib\\gdk-pixbuf-2.0', 'share\\glib-2.0', 'share\\fonts', 'share\\icons', 'share\\themes\\Default', 'share\\themes\\HighContrast']
gtk_dlls = []
tmp_dlls = []
cdir = os.getcwd()
for dll in os.listdir(include_dll_path):
if dll.lower().endswith('.dll'):
gtk_dlls.append(os.path.join(include_dll_path, dll))
tmp_dlls.append(os.path.join(cdir, dll))
for dll in gtk_dlls:
shutil.copy(dll, cdir)
# -- change main.py if needed -- #
setup(windows=['main.py'], options={
'py2exe': {
'includes' : ['gi'],
'packages': ['gi']
}
})
dest_dir = os.path.join(cdir, 'dist')
if not os.path.exists(dest_dir):
os.makedirs(dest_dir)
for dll in tmp_dlls:
shutil.copy(dll, dest_dir)
os.remove(dll)
for d in gtk_dirs_to_include:
shutil.copytree(os.path.join(site_dir, "gnome", d), os.path.join(dest_dir, d))
运行setup.py,最好从命令行输入 python setup.py py2exe ,然后在项目文件夹中创建两个新目录: \ build 和 \ dist 。 \ dist 文件夹是我们关心的文件夹,您可以在其中找到所有必需的Dll,以及您的程序新创建的.exe,以您的主python脚本命名(在我的情况下为main.exe)
重要补充说明:如果您在项目中使用任何非python文件(在我的情况下为css文件),请务必将其复制并粘贴到 \ dist 目录,或者应用程序无法找到它!
据我所知,这个解决方案只适用于Windows的发布(这是我的主要目标),但将来我会尝试为Linux和OSX做同样的事情,我会更新相应的答案