【问题标题】:Package a python app like spyder does像 spyder 一样打包一个 python 应用程序
【发布时间】:2017-06-17 00:55:08
【问题描述】:

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

我想知道我该怎么做才能当有人 pip 安装我的程序时,它会出现在系统菜单上,就像安装 Spyder ( 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"
                      ],
)

【问题讨论】:

    标签: python installation python-3.5 setup.py


    【解决方案1】:

    您可以在第 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 用于安装系统范围的应用程序,或~/.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/@ 987654323@

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

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

    • 创建自定义命令PostInstallCommand 并通过将其添加到cmdclass 属性来指示setup() 运行它,就像cmdclass={'install': PostInstallCommand} 检查this answer for detailed instructions

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

    希望这会有所帮助!

    【讨论】:

    • pip 怎么知道你有一个包裹放在那里?
    • 我不明白你的意思
    • 是的,如果您想测试它,您可以尝试本地 pip 安装,只需转到您的项目根目录(setup.py 所在的位置)并在进行修改后执行pip install .
    • 什么样的反馈?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多