Debianzing Python程序以获得.deb

时间:2013-07-01 09:41:35

标签: python apt linuxmint

目标

创建可安装的.deb文件(或包)。点击后将在Linux机器上安装软件,并在GNOME面板上放置一个图标。从那里启动这个应用程序。

我所说的

我提到了两个去贬值指南。

Guide 1

Guide 2

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

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

我需要什么

我有一个简单的python程序。它需要你的年龄,然后如果年龄低于,等于或超过18岁打印出来。这个程序只有一个文件而没有其他依赖项。我希望将其构建为.deb

功能

-Python 2.7

-Linux Mint

修改

我按照你的指示遵循了确切的目录结构。并将所有myscript替换为cowsandbulls。构建完成后我得到了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

2 个答案:

答案 0 :(得分:25)

我刚刚测试了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后,它将在整个系统范围内可用。如果您的脚本使用tkinterwxpython之类的内容并且具有图形用户界面,则应使用gui_scripts代替console_scripts

data_files指令会将合适的桌面文件安装到/usr/share/applications,以便您也可以从桌面环境中启动myscriptvxlabs-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

答案 1 :(得分:2)

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

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

  1. 创建文件和文件夹以重新创建以下结构:
  2.     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/下放置一个文件{1}}将从/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软件包一样)


    4. 以下是control文件的示例。您只需将其复制粘贴到一个名为&#34; control&#34;的空文件中。并将其放在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>进行构建,可以使用this program来完成一个命令。如果你经常建立包裹,那么做我提到的所有东西都会很痛苦!

      *该指南取自Basics of Debian Packages