Python 3.x 如何在基于Linux的操作系统上分发基于python的软件
我想要实现的目标的浓缩版本: 从my source.py源代码创建.rpm和.deb包,并确保在基于deb/rpm的linux发行版上安装它们时解决所有依赖项 更多详细信息: 假设我创建了一个软件,它位于如下文件夹结构中:Python 3.x 如何在基于Linux的操作系统上分发基于python的软件,python-3.x,linux,rpm,deb,Python 3.x,Linux,Rpm,Deb,我想要实现的目标的浓缩版本: 从my source.py源代码创建.rpm和.deb包,并确保在基于deb/rpm的linux发行版上安装它们时解决所有依赖项 更多详细信息: 假设我创建了一个软件,它位于如下文件夹结构中: ---MyProgram Folder ---MyProgram Folder ---img Folder ---logo.ico File ---media Fo
---MyProgram Folder
---MyProgram Folder
---img Folder
---logo.ico File
---media Folder
---head.txt File
---__init__.py File
---source.py File
---a.py File
---LICENSE File
---README.md File
---setup.py File
文件setup.py包含以下内容:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="MyProgram",
version="0.0.1",
author="First Last",
author_email="email@memore.com",
description="A tool to create nice things",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://google.com",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.7',
data_files=[
('.../MyProgram/img/logo.ico'),
('.../MyProgram/media/head.txt'),
],
)
我现在跑步
python setup.py sdist bdist_rpm
从“…/MyProgram”下的cmd行。创建了两个文件夹“dist”和“build”,以及“MyProgram.tar.gz”和两个rpm“MyProgram noarch.rpm”和“MyProgram src.rpm”。
当我尝试在Fedora31下安装'noarch.rpm'时,进程成功结束,但没有创建“快捷方式”,当我在cmd行中键入MyProgram时,找不到它
rpm -ql MyFilter
找到它并输出一组路径:
/usr/lib/python3.7/site-packages/MyProgram/...
/usr/lib/python3.7/site-packages/MyProgram/source.py
/usr/lib/python3.7/site-packages/MyProgram/a.py
....
这说明我的安装至少复制了基本文件系统。但我也看到所有原始的.py文件仍然是.py文件
我的问题:
- 如何“生成”rpm以使所有依赖项都包含在rpm中,或者至少在安装rpm时由dnf/apt/yum解决?换句话说:是否可以像.exe中那样将所有依赖项捆绑到rpm/deb中
- 如何将“/usr/bin”或“usr/share”这样的路径指定为安装目标 迪尔李>
- 如何将启动器应用程序捆绑到rpm/deb中
- 以上是一个很好的方法吗
只需我的两分钱,而不是一个完整的答案。将主要涉及RPM包装
bdist\u rpm
选项看起来很简单,但是您几乎无法控制它生成/使用的.spec
文件的逻辑,并且无法执行诸如scriplets等奇特的操作
也就是说,除非您采取让它生成.spec
文件并退出(而不是构建最终RPM)的方法。从:
如果愿意,可以将这三个步骤分开。您可以使用--spec only选项使bdist_rpm只创建.spec文件并退出;在本例中,.spec文件将写入“分发目录”-通常为dist/,但可使用--dist dir选项进行自定义。(通常,.spec文件会深入到“构建树”中,位于由bdist_rpm创建的临时目录中。)
但出于偏好和一致性的考虑,我建议遵循特定于发行版的Python应用打包指南
这样,您将更加符合您正在构建的发行版
但这不是最简单的方法。你将不得不通过一些转换。基本上,如果您正在为CentOS/RHEL构建任何东西,则应遵守Fedora的包装指南
您可以通过示例.spec
文件找到用于构建同一应用程序的Python2和Python3版本的额外参考
对于整个“像发行版一样构建”的事情,您肯定希望考虑使用mock
来完成任务,在chroot中构建您的包
至于“快捷方式”问题,您必须让您的setup.py
声明一些控制台脚本,以便在安装软件包时创建一个。例如,来自:
当您安装Python软件包时,此条目将导致创建/安装一个“二进制”lastversion
(它运行定义的函数)
随后,在spec文件中,宏%py2_install
将使用setup.py
创建相同的启动程序
然后,您将能够通过将launcher放入规范文件的文件部分来确保它已打包:
%files -n python3-myapp
%license COPYING
%doc README.rst
%{python3_sitelib}/%{srcname}/
%{python3_sitelib}/%{srcname}-*.egg-info/
%{_bindir}/myapp
%files -n python3-myapp
%license COPYING
%doc README.rst
%{python3_sitelib}/%{srcname}/
%{python3_sitelib}/%{srcname}-*.egg-info/
%{_bindir}/myapp