打包像spyder一样的python应用程序

San*_*era 16 python installation setup.py python-3.5

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

我想知道我有什么必须这样做,当有人pip-install我的程序时,它出现在系统菜单上,就像安装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"
                      ],
)
Run Code Online (Sandbox Code Playgroud)

Has*_*nPy 14

您可以在第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
Run Code Online (Sandbox Code Playgroud)

然后data_filessetup()实例的常规设置中调用它.

它的作用是指示安装程序复制所需的文件以在其各自的文件夹中创建一个菜单项.[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.
Run Code Online (Sandbox Code Playgroud)

您可以选择将应用程序图标放在任何位置并使用其完整路径,或者只需将其放在share/pixmaps/文件名下面并引用它.

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

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

Windows安装后脚本的一点说明:
似乎已经从spyder-ide的setup.py文件中删除了实现其执行的机制,所以你们所有人都在挖掘它们是如何工作的,你们将无法找到,除非检查文件历史记录,以便清除混淆,这是你可以做什么来让它执行(而不是spyder-ide方式):

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

在附加PostInstallCommandcmdclass属性之前不要忘记检查操作系统,您不希望在linux环境中执行它.

希望这可以帮助!