像 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 上执行它环境
希望对您有所帮助!
我有一个开源 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 上执行它环境
希望对您有所帮助!