如何在基于Linux的操作系统上分发基于python的软件

问题描述 投票:-1回答:1

我要实现的压缩版本:从我的source.py源代码创建.rpm和.deb软件包,并确保在将它们安装在基于deb / rpm的linux发行版上时,所有依赖项都得到解析。

更多详细信息:假设我已经创建了一个软件,该软件位于这样的文件夹结构中:

---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 protected]",
    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”。当我尝试在fedora 31下安装'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中的启动器应用程序?
  • 以上是执行此操作的好方法吗?

如果解决方案微不足道,而我只是忽略了它,我真的很抱歉打扰您,但是atm我看不到它。具有相关信息并且我已经查看过的网站:

https://docs.python.org/2.0/dist/creating-rpms.html

https://github.com/AppImage/AppImageKit/wiki/Bundling-Python-apps

Python 3.5 create .rpm with pyinstaller generated executable

https://github.com/junaruga/rpm-py-installer

https://www.pyinstaller.org/

https://packaging.python.org/overview/#python-source-distributions

https://packaging.python.org/overview/

https://pyinstaller.readthedocs.io/en/stable/usage.html

https://pyinstaller.readthedocs.io/en/stable/installation.html

https://python-packaging-tutorial.readthedocs.io/en/latest/setup_py.html

python-3.x linux rpm deb
1个回答
0
投票
仅是我的两分钱,而不是一个完整的答案。将主要涉及RPM包装。

bdist_rpm选项似乎很简单,但是您几乎无法控制它生成/使用的.spec文件的逻辑,并且不能执行诸如片段代码之类的奇特的东西。

即,除非采取让它生成.spec文件并退出的方法(而不是构建最终RPM)。从docs

如果您愿意,可以将这三个步骤分开。您可以使用--spec-only选项使bdist_rpm仅创建.spec文件并退出;在这种情况下,.spec文件将被写入“分发目录”,通常为dist /,但可以使用--dist-dir选项进行自定义。 (通常,.spec文件在由bdist_rpm创建的临时目录中的“构建树”中深入显示。)

但是,出于偏好和一致性的考虑,我建议遵循发行版特定的Python应用程序打包指南。

这样,您将更适合您要为其构建的发行版。

尽管这不是最简单的方法。您将不得不切换一些docs。基本上,如果您要构建CentOS / RHEL,则应遵守Fedora的包装准则。

您可以找到额外的参考文献here,并带有用于构建同一应用程序的Python 2和3版本的示例.spec文件。

对于整个“像发行版一样的构建”,您肯定会考虑使用mock来完成工作,以在chroot中构建您的包。

关于“快捷方式”问题,您必须让setup.py声明一些控制台脚本,以便它在安装软件包时创建一个。例如。来自lastversion's setup.py

entry_points={"console_scripts": ["lastversion = lastversion:main"]},

此条目将导致在安装Python软件包时创建/安装“二进制” lastversion(运行定义的函数)。

随后,在规格文件中,宏%py2_install将使用setup.py创建相同的启动程序。

然后您就可以通过将启动器放在spec文件的文件部分中来确保打包了启动器:

%files -n python3-myapp %license COPYING %doc README.rst %{python3_sitelib}/%{srcname}/ %{python3_sitelib}/%{srcname}-*.egg-info/ %{_bindir}/myapp

© www.soinside.com 2019 - 2024. All rights reserved.