像Spyder一样打包Python应用程序

16

我有一个用Python编写的开源软件(GridCal),使用PyQt5创建了一个GUI。该程序可以通过pip进行安装:pip3 install GridCal

我想知道我需要做什么才能让其他人在使用pip安装我的程序后,它会出现在系统菜单中,就像安装Python IDE Spyder一样。

到目前为止,我所能提供的只有我的程序的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"
                      ],
)
1个回答

14

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

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用于系统范围内安装的应用程序,或者~/.local/share/applications用于用户特定应用程序[1]。文件结构如下(显而易见,有关更多键的参考信息可以在上述参考链接中找到):
[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 程序员),因此他们编写了一个完整的后安装脚本来处理为 Windows 制作菜单快捷方式[3]

有关 Windows 后安装脚本的一些澄清:
看起来实现其执行的机制已经从 spyder-ide 的setup.py文件中删除了,因此所有挖掘如何工作的人,除非您查看文件历史记录,否则您将无法找到它的工作原理,所以为了消除混乱,以下是您可以执行的操作(而不是 spyder-ide 的方式):

  • 创建一个自定义命令PostInstallCommand,并通过将其添加到cmdclass属性来指示setup()运行它,例如cmdclass={'install': PostInstallCommand},请查看此答案以获取详细说明

在将PostInstallCommand附加到cmdclass属性之前,请不要忘记检查操作系统,您不希望在 Linux 环境中执行它。

希望这能帮到您!


pip怎么知道你安装了一个包? - gather bar
我不明白你的意思。 - HassenPy
是的,如果你想测试它,可以尝试本地的pip安装,只需进入项目根目录(即setup.py所在的位置),并在进行修改后执行“pip install .”。 - HassenPy
什么样的反馈? - HassenPy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接