Embalagem uma biblioteca Python
Pergunta
Eu tenho alguns plugins Munin que relatam estatísticas de um banco de Autonomia. Todos eles usam uma pequena biblioteca que raspa a saída de status XML para os números relevantes.
Eu estou tentando agrupar a biblioteca e plugins em um RPM Puppet-instalável. A construção RPM real deve ser simples; uma vez que tenho um distfile produziu-distutils
posso fazê-lo em um RPM com base em um arquivo .spec beliscou a partir do DAG ou Epel repos [1]. É o distutils
mordeu estou inseguro - na verdade eu nem tenho certeza minha biblioteca está corretamente escrita para embalagem. Veja como funciona:
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']
código Plugin:
from idol7stats import IDOL7Stats
a = IDOL7Stats('db.example.com', 23113)
a.collect()
print a.total_slots()
Eu acho que eu quero idol7stats.py para encerrar em /usr/lib/python2.4/site-packages/idol7stats
, ou qualquer outra coisa no caminho de busca do Python. Que mágica distutils
eu preciso? Isto:
from distutils.core import setup
setup(name = 'idol7stats',
author = 'Me',
author_email = 'me@example.com',
version = '0.1',
py_modules = ['idol7stats'])
quase funciona, exceto o código vai em /usr/lib/python2.4/site-packages/idol7stats.py
, não um subdiretório. Espero que este é baixo para o meu não compreender a diferença entre módulos / pacotes / outros recipientes em Python.
Então, o que está a dificuldade?
[1] Sim, eu poderia apenas dedilhar a biblioteca em /usr/lib/python2.4/site-packages
usando RPM, mas eu quero saber como empacotar código Python.
Solução
Você precisa criar um pacote para fazer o que quiser. Você precisa de um diretório chamado idol7stats
contendo um arquivo chamado __init__.py
e quaisquer outros módulos da biblioteca para pacote. Além disso, isso vai afetar as importações dos seus roteiros; se você colocar idol7stats.py
em um pacote chamado idol7stats
, em seguida, seus scripts precisam "import idol7stats.idol7stats
".
Para evitar isso, você pode simplesmente mudar o nome idol7stats.py
para idol7stats/__init__.py
, ou você poderia colocar esta linha em idol7stats/__init__.py
a "massagem" as importações para a maneira que você espera deles:
from idol7stats.idol7stats import *