Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在基于Linux的操作系统上分发基于python的软件_Python 3.x_Linux_Rpm_Deb - Fatal编程技术网

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

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

我想要实现的目标的浓缩版本: 从my 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@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