31

目标

创建可安装.deb文件(或包)。单击它会在 Linux 机器上安装软件,并在 GNOME 面板上放置一个图标。以便从那里启动此应用程序。

我所指的

我提到了两个 debianizing 指南。

指南 1

指南 2

第一个有一段无法理解的视频,部分原因是口音,部分原因是它已经过时了。(它是在 2007 年上传的)

第二个完全是文字。我到了第四步,构建包。但是当我这样做时,我得到的输出与指南中给出的不匹配。

我需要什么

我有一个简单的 python 程序。如果年龄低于、等于或高于 18 岁,它会计算您的年龄,然后打印出来。该程序只有一个文件,没有其他依赖项。我想把它构建成一个.deb.

眼镜

-Python 2.7

-Linux薄荷

编辑

我按照您的指示遵循了确切的目录结构。并全部替换myscriptcowsandbulls. 构建完成,我得到了 Debian。当我安装它然后cowsandbulls从终端运行命令时,出现以下错误:

Traceback (most recent call last):
  File "/usr/bin/cowsandbulls", line 9, in <module>
    load_entry_point('cowsandbulls==1.0', 'gui_scripts', 'cowsandbulls')()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 337, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2311, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2017, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named cowsandbulls
4

2 回答 2

33

我刚刚测试了stdeb(参见https://pypi.python.org/pypi/stdeb),这是一个 Python 包,用于将任何其他 Python 包转换为 Debian 包。

首先我安装了stdeb:

apt-get install python-stdeb

然后我做了一个简单的脚本调用myscript.py,内容如下:

def main():
    print "Hello world, says myscript!"
    # wait for input from the user
    raw_input()

if __name__ == '__main__':
    main()

重要的是,您的目录结构应该是:

somewhere/myscript/
    setup.py
    myscript/
        __init__.py
        myscript.py

在 setup.py 文件中,您可以执行以下操作:

import os
from setuptools import setup
from nvpy import nvpy

setup(
    name = "myscript",
    version = "1.0",
    author = "Charl P. Botha",
    author_email = "cpbotha@vxlabs.com",
    description = "Demo of packaging a Python script as DEB",
    license = "BSD",
    url = "https://github.com/cpbotha/nvpy",
    packages=['myscript'],
    entry_points = {
        'console_scripts' : ['myscript = myscript.myscript:main']
    },
    data_files = [
        ('share/applications/', ['vxlabs-myscript.desktop'])
    ],
    classifiers=[
        "License :: OSI Approved :: BSD License",
    ],
)

console_scripts指令很重要,它将创建一个名为 的可执行脚本my_script,在您安装生成的 DEB 后,该脚本将在系统范围内可用。如果你的脚本使用类似tkinteror的东西wxpython并且有一个图形用户界面,你应该使用gui_scripts而不是console_scripts.

data_files指令会将合适的桌面文件安装到/usr/share/applications中,以便您也可以myscript从桌面环境启动。vxlabs-myscript.desktop看起来像这样:

[Desktop Entry]
Version=1.0
Type=Application
Name=myscript
Comment=Minimal stdeb example
# myscript should wait for user input at the end, else the terminal
# window will disappear immediately.
Exec=myscript
Icon=/usr/share/icons/gnome/48x48/apps/file-manager.png
Categories=Utility;
# desktop should run this in a terminal application
Terminal=true
StartupNotify=true
StartupWMClass=myscript

要构建 DEB,请在顶层执行以下操作myscript

python setup.py --command-packages=stdeb.command bdist_deb

这将在 deb_dist 目录中创建一个 .deb 。

在安装了我这样创建的 DEB 之后,我可以从命令行运行myscript,也可以从我的桌面环境中调用它。

这是一个带有上述示例代码的 GitHub 存储库:https ://github.com/cpbotha/stdeb-minimal-example

于 2013-07-01T10:48:36.117 回答
3

构建 deb 包的正确方法是使用dpkg-buildpackage,但有时它有点复杂。相反,您可以使用dpkg -b <folder>它,它将创建您的 Debian 软件包。

dpkg -b <folder>这些是使用任何二进制文件或任何无需手动编译自动运行的脚本(Python、Bash、Pearl 和 Ruby)创建 Debian 软件包的基础知识:

  1. 创建文件和文件夹以重新创建以下结构:
    ProgramName-Version/
    ProgramName-Version/DEBIAN
    ProgramName-Version/DEBIAN/control
    ProgramName-Version/usr/
    ProgramName-Version/usr/bin/
    ProgramName-Version/usr/bin/your_script

放置的脚本/usr/bin/直接从终端调用。请注意,我没有向脚本添加扩展名。

此外,您会注意到 deb 包的结构将是安装后程序的结构。因此,如果您的程序只有一个文件,则如果遵循此逻辑,则可以将其ProgramName-Version/usr/bin/your_script直接放在.ProgramName-Version/usr/share/ProgramName/all your files/usr/bin//usr/share/ProgramName/

  1. 将所有文件夹权限更改为root:

    chown root:root -R /path/to/ProgramName-Version
    
  2. 更改脚本的权限:

    chmod 0755 /path/to/the/script
    
  3. 最后,您可以运行:dpkg -b /path/to/the/ProgramName-Version您的 deb 包将被创建!(你也可以添加 post/pre inst 脚本和你想要的一切;它就像一个普通的 Debian 包一样工作。)


这是该control文件的示例。您只需将其复制粘贴到一个名为“control”的空文件中并将其放入DEBIAN文件夹中。

Package: ProgramName
Version: VERSION
Architecture: all
Maintainer: YOUR NAME <EMAIL>
Depends: python2.7, etc , etc,
Installed-Size: in_kb
Homepage: http://foo.com
Description: Here you can put a one line description. This is the short Description.
 Here you put the long description, indented by 1 space.

如果你想使用它来构建,dpkg -b <folder>你可以使用这个程序,它可以用一个命令完成所有的事情。如果你经常构建包,那么做我提到的所有事情是很痛苦的!

*该指南摘自《Debian 软件包基础知识》

于 2014-09-28T10:19:14.550 回答