像 spyder 一样打包 python 应用程序

Package a python app like spyder does

我有一个开源 python 软件 (GridCal),它有一个用 PyQt5 制作的 GUI。该程序可通过 pip 安装 pip3 install GridCal.

我想知道我必须做什么才能当有人 pip 安装我的程序时,它出现在系统菜单上 就像安装 Spyder 一样 (The python IDE)

到目前为止,我只能提供我程序的setup.py,但我不知道它是否相关。

from distutils.core import setup
import sys
import os

name = "GridCal"

# Python 2.4 or later needed
if sys.version_info < (3, 5, 0, 'final', 0):
    raise (SystemExit, 'Python 3.5 or later is required!')

# Build a list of all project modules
packages = []
for dirname, dirnames, filenames in os.walk(name):
        if '__init__.py' in filenames:
            packages.append(dirname.replace('/', '.'))

package_dir = {name: name}

# Data_files (e.g. doc) needs (directory, files-in-this-directory) tuples
data_files = []
for dirname, dirnames, filenames in os.walk('doc'):
        fileslist = []
        for filename in filenames:
            fullname = os.path.join(dirname, filename)
            fileslist.append(fullname)
        data_files.append(('share/' + name + '/' + dirname, fileslist))

setup(
    # Application name:
    name=name,

    # Version number (initial):
    version="1.025",

    # Application author details:
    author="Santiago Peñate Vera",
    author_email="santiago.penate.vera@gmail.com",

    # Packages
    packages=packages,

    data_files=data_files,

    # Include additional files into the package
    include_package_data=True,

    # Details
    url="http://pypi.python.org/pypi/GridCal/",

    # License file
    license="LICENSE.txt",

    # description
    description="Research Oriented electrical simulation software.",

    # long_description=open("README.txt").read(),

    # Dependent packages (distributions)
    install_requires=["numpy",
                      "scipy",
                      "networkx",
                      "pandas",
                      "xlwt",
                      "xlrd",
                      "PyQt5",
                      "matplotlib",
                      "qtconsole"
                      ],
)

您可以在第 77 行的 setup.py 脚本中找到 spyder-ide 如何实现此功能,代码如下:

def get_data_files():
    """Return data_files in a platform dependent manner"""
    if sys.platform.startswith('linux'):
        if PY3:
            data_files = [('share/applications', ['scripts/spyder3.desktop']),
                      ('share/pixmaps', ['img_src/spyder3.png'])]
        else:
            data_files = [('share/applications', ['scripts/spyder.desktop']),
                      ('share/pixmaps', ['img_src/spyder.png'])]
    elif os.name == 'nt':
        data_files = [('scripts', ['img_src/spyder.ico',
                               'img_src/spyder_reset.ico'])]
    else:
        data_files = []
    return data_files

然后它在 setup() 实例的常规 data_files 设置中被调用。

它的作用是指示安装程序复制所需的文件以在各自的文件夹中创建一个菜单项。[0]

在 linux 系统中您需要创建一个 appName.desktop 文件,这些文件通常驻留在 /usr/share/applications/usr/local/share/applications 中安装的应用程序 system-wide,或~/.local/share/applications user-specific 个应用程序[1]

文件结构如下所示(self-explanatory,更多键的参考可以在上面的参考link中找到):

[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=AppName
Exec=/path/to/executable
Icon=/path/to/icon
Categories=Graphics;2DGraphics;Development;
Comment=Tooltip comment appears when you hover on menu icon.

您可以选择将您的应用程序图标放在任何地方并使用其完整路径,或者简单地放在 share/pixmaps/ 下并仅通过其文件名引用它。

请注意,在指定要安装的 .desktop 和图标文件的位置时,脚本不使用完整路径,这是因为这些位置将相对于当前 sys.exec_prefix 默认为/usr/local/[2]

在 windows 上,您需要在 ~\Windows\Start Menu\Programs 目录中创建一个 .lnk(二进制文件),我无法详细解释它是如何工作的(不是 windows 程序员),为此他们编写了一个完整的 post-installation 脚本来为 windows[3] 制作菜单快捷方式。

对 windows post-installation 脚本的一点说明:
似乎实现其执行的机制已从 spyder-ide 的 setup.py 文件中删除,所以你们所有人都在挖掘它是如何工作的,除非你检查,否则你将无法找到答案文件历史记录,为了消除混淆,您可以执行以下操作(不是 spyder-ide 方式):

  • 创建自定义命令 PostInstallCommand 并通过将其添加到 cmdclass 属性来指示 setup() 到 运行 它 cmdclass={'install': PostInstallCommand} 检查 [=34] =]

在将 PostInstallCommand 附加到 cmdclass 属性之前,请不要忘记检查 OS,您不会希望在 linux 上执行它环境

希望对您有所帮助!