我有几个munin插件,可以从自治数据库中报告统计数据。它们都使用一个小库,该库为相关的数字刮取xml状态输出。
我正在尝试将库和插件捆绑到一个可安装Puppet的RPM中实际的RPM构建应该很简单;一旦我有了一个distutils
生成的distfile,我就可以根据从DAG或EPEL repos[1]中提取的.spec文件将其转换成RPM。这是我不确定的distutils
位——事实上,我甚至不确定我的库是否正确编写用于打包其工作原理如下:
偶像7stats.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搜索路径中的其他内容。我需要什么魔法?这:from distutils.core import setup
setup(name = 'idol7stats',
author = 'Me',
author_email = '[email protected]',
version = '0.1',
py_modules = ['idol7stats'])
几乎可以工作,除了代码进入
distutils
,而不是子目录。我希望这是因为我不理解Python中模块/包/其他容器之间的区别。那么,问题是什么?
[1]是的,我可以使用RPM将库链接到
/usr/lib/python2.4/site-packages/idol7stats.py
中,但我想知道如何打包Python代码。 最佳答案
你需要创建一个包来做你想做的事情。您需要一个名为idol7stats
的目录,其中包含一个名为__init__.py
的文件和任何其他要打包的库模块此外,这将影响脚本的导入;如果将idol7stats.py
放在名为idol7stats
的包中,则脚本需要“import idol7stats.idol7stats
”。
为了避免这种情况,您可以将idol7stats.py
重命名为idol7stats/__init__.py
,或者将此行放入idol7stats/__init__.py
中,以您期望的方式“按摩”导入:
from idol7stats.idol7stats import *