OK, so I found a way to do it, which (mostly) works.
I have a routine which triggers on a '353' event, which is how the server responds to /NAMES commands. It stores the list of nicks into a shelve db, indexed by channel.
def nametrigger(phenny, input):
names = re.split(' ', input)
names = [n.split('!')[0] for n in names]
names = [n.replace('~','') for n in names]
namesdb = shelve.open(phenny.logdir+'/nicks')
namesdb[input.args[2]] = names
namesdb.close()
nametrigger.event = '353'
nametrigger.rule = '(.*)'
nametrigger.priority = 'high'
I wrote some utility commands to call /NAMES whenever joining a channel, and whenever someone else joins, leaves, or changes nicks. That should keep the db up to date, though it doesn't seem to work 100% yet.
Then, whenever I want the list of nicks, I can just load the db.