【问题标题】:Packaging a Python library打包 Python 库
【发布时间】:2010-09-24 11:38:23
【问题描述】:

我有几个 Munin 插件可以从 Autonomy 数据库报告统计信息。他们都使用一个小型库来抓取相关数字的 XML 状态输出。

我正在尝试将库和插件捆绑到可安装 Puppet 的 RPM 中。实际的 RPM 构建应该是直截了当的;一旦我有一个distutils-produced 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 代码。

【问题讨论】:

    标签: python packaging distutils


    【解决方案1】:

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

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

    from idol7stats.idol7stats import *
    

    【讨论】:

    • 啊哈!将代码放入 init.py 看起来正是我所追求的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    相关资源
    最近更新 更多