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.

Foi útil?

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 *
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top