Verpackung eine Python-Bibliothek
Frage
Ich habe ein paar Munin Plugins, die Statistiken von einer Autonomie Datenbank melden. Sie alle nutzen eine kleine Bibliothek, die den XML-Statusausgang für die relevanten Zahlen schabt.
Ich versuche, die Bibliothek und Plugins in einem Puppen installierbare RPM zu bündeln. Die tatsächlichen RPM-Gebäude sollten einfach sein; sobald ich einen distutils
produzierte distfile habe, kann ich es in ein RPM auf einer .spec Datei aus dem Dag oder EPEL repos gekniffen basierend machen [1]. Es ist die distutils
Bit Ich bin nicht sicher - in der Tat Ich bin nicht einmal sicher, dass meine Bibliothek richtig für die Verpackung geschrieben wird. Hier ist, wie es funktioniert:
idol7stats.py:
import datetime
import os
import stat
import sys
import time
import urllib
import xml.sax
class IDOL7Stats:
cache_dir = '/tmp'
def __init__(self, host, port):
self.host = host
self.port = port
# ...
def collect(self):
self.data = self.__parseXML(self.__getXML())
def total_slots(self):
return self.data['Service:Documents:TotalSlots']
Plugin-Code:
from idol7stats import IDOL7Stats
a = IDOL7Stats('db.example.com', 23113)
a.collect()
print a.total_slots()
Ich glaube, ich möchte idol7stats.py in /usr/lib/python2.4/site-packages/idol7stats
aufzuwickeln oder sonst etwas in Python-Suchpfad. Welche distutils
Magie brauche ich? Dies:
from distutils.core import setup
setup(name = 'idol7stats',
author = 'Me',
author_email = 'me@example.com',
version = '0.1',
py_modules = ['idol7stats'])
fast funktioniert, mit Ausnahme der Code in /usr/lib/python2.4/site-packages/idol7stats.py
geht, nicht ein Unterverzeichnis. Ich erwarte, dass dies bis zu meinem nicht verstehen den Unterschied zwischen den Modulen / packages / anderen Behältern in Python.
Also, was ist der Haken?
[1] Ja, ich konnte einfach die Bibliothek in /usr/lib/python2.4/site-packages
mit RPM plonk, aber ich möchte wissen, wie Python-Code zu verpacken.
Lösung
Sie benötigen ein Paket zu erstellen, um zu tun, was Sie wollen. Sie würden ein Verzeichnis namens idol7stats
brauchen eine Datei namens __init__.py
und alle anderen Bibliotheksmodule enthalten, zu verpacken. Auch wird dies Ihre Skripte Einfuhren beeinflussen; wenn Sie idol7stats.py
in einem Paket namens idol7stats
setzen, dann Ihre Skripte müssen „import idol7stats.idol7stats
“.
Um das zu vermeiden, könnten Sie einfach idol7stats.py
umbenennen idol7stats/__init__.py
, oder Sie können diese Zeile in idol7stats/__init__.py
setzen zu „Massage“ die Einfuhren in die Art und Weise man sie erwarten:
from idol7stats.idol7stats import *