打包Python库

4 投票
1 回答
599 浏览
提问于 2025-04-11 19:23

我有几个Munin插件,它们可以从一个Autonomy数据库中获取统计数据。所有插件都使用一个小库,这个库会从XML状态输出中提取相关的数字。

我正在尝试把这个库和插件打包成一个可以用Puppet安装的RPM包。实际上,制作RPM包应该是比较简单的;一旦我有了一个通过distutils生成的分发文件,我就可以根据从Dag或EPEL仓库借来的.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] 是的,我可以直接把库放到/usr/lib/python2.4/site-packages中,使用RPM,但我想知道如何打包Python代码。

1 个回答

2

你需要创建一个叫做 的东西来实现你想要的功能。你需要一个名为 idol7stats 的文件夹,里面要有一个叫 __init__.py 的文件,还有其他你想打包的库模块。这样做会影响你脚本中的导入方式;如果你把 idol7stats.py 放在名为 idol7stats 的包里,那么在你的脚本中就需要用 "import idol7stats.idol7stats" 来导入。

为了避免这种情况,你可以直接把 idol7stats.py 重命名为 idol7stats/__init__.py,或者你可以在 idol7stats/__init__.py 文件中添加这一行代码,以便让导入的方式符合你的预期:

from idol7stats.idol7stats import *

撰写回答