打包Python库

时间:2008-11-28 17:19:09

标签: python packaging distutils

我有一些Munin插件可以报告来自Autonomy数据库的统计信息。它们都使用一个小型库来擦除相关数字的XML状态输出。

我正在尝试将库和插件捆绑到Puppet可安装的RPM中。实际的RPM建设应该是直截了当的;一旦我有一个distutils - 生成的distfile,我可以根据从Dag或EPEL repos [1]收集的.spec文件将其转换为RPM。这是我不确定的distutils位 - 实际上我甚至不确定我的库是否正确用于打包。以下是它的工作原理:

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']

插件代码:

from idol7stats import IDOL7Stats
a = IDOL7Stats('db.example.com', 23113)
a.collect()
print a.total_slots()

我想我希望idol7stats.py在/usr/lib/python2.4/site-packages/idol7stats中结束,或在Python的搜索路径中结束。我需要什么distutils魔法?这样:

from distutils.core import setup

setup(name = 'idol7stats',
  author = 'Me',
  author_email = 'me@example.com',
  version = '0.1',
  py_modules = ['idol7stats'])

几乎可以工作,除了代码进入/usr/lib/python2.4/site-packages/idol7stats.py,而不是子目录。我希望这是由于我不理解Python中模块/包/其他容器之间的区别。

那么,有什么用呢?

[1]是的,我可以使用RPM在/usr/lib/python2.4/site-packages中修改库,但我想知道如何打包Python代码。

1 个答案:

答案 0 :(得分:2)

您需要创建一个来执行您想要的操作。您需要一个名为idol7stats的目录,其中包含一个名为__init__.py的文件以及要打包的任何其他库模块。此外,这将影响脚本的导入;如果您将idol7stats.py放在名为idol7stats的包中,那么您的脚本需要“import idol7stats.idol7stats”。

为了避免这种情况,您可以将idol7stats.py重命名为idol7stats/__init__.py,或者您可以将此行放入idol7stats/__init__.py以按照预期的方式“按下”导入:

from idol7stats.idol7stats import *