# Copyright 2001 ActiveState """perlmod - Simplified access to Perl modules This module provide adaptors that makes it easier to access and use Perl modules from Python. It provide classes to encapsulate Perl modules and Perl classes. Example usage of an Perl OO module: from perlmod import Perl HTTP = Perl.HTTP ua = Perl.LWP.UserAgent() res = ua.request(HTTP.Request("GET", "http://www.python.org")) if res.is_success(): print res.content() else: print res.status_line() Another way to do it: from perlmod import PerlClass # Import classes LWP_UserAgent = PerlClass("LWP::UserAgent") HTTP_Request = PerlClass("HTTP::Request") # do the stuff ua = LWP_UserAgent() res = ua.request(HTTP_Request("GET", "http://www.python.org")) if res.is_success(): print res.content() else: print res.status_line() An attribute prefixed with '__' is regarded as a class methods: from perlmod import Perl u = Perl.URI.file.__cwd() # $u = URI::file->cwd; print u Example usage of an functional style module: from perlmod import PerlModule print PerlModule("MIME::Base64").encode("foo") Explicit manual import: from perlmod import PerlModule encode_base64 = PerlModule("MIME::Base64").encode print encode_base64("foo") Import all functions that are exported by default (@EXPORT): from perlmod import PerlModule PerlModule("MIME::Base64").__import__("*", locals()) print encode_base64("foo") """ class PerlClass: def __init__(self, name = None, module=None, ctor="new"): self.name = name self.module = module or name self.ctor = ctor def __getattr__(self, name): if name[:2] == '__': if name[-2:] != '__' and name != '__': return PerlClass(self.name, ctor=name[2:]) raise AttributeError, name if self.name: name = self.name + "::" + name return PerlClass(name) def __call__(self, *args): import perl name = self.name perl_require(self.module) return apply(perl.callm, (self.ctor, name) + args) class PerlModule: def __init__(self, name): self.name = name def __getattr__(self, name): if name[:2] == '__': raise AttributeError, name perl_require(self.name) full_name = self.name + "::" + name import perl return perl.get_ref(full_name) def __import__(self, funcs, namespace): perl_require(self.name) import perl if funcs == '*': funcs = tuple(perl.get_ref("@" + self.name + "::EXPORT")) elif type(funcs) == type(""): funcs = (funcs,) for f in funcs: namespace[f] = perl.get_ref(self.name + "::" + f) Perl = PerlClass() INC = {} def perl_require(mod): # Some caching since the real 'perl.require' is a bit # heavy. global INC try: return INC[mod] except KeyError: pass import perl INC[mod] = perl.require(mod) return INC[mod]