Skinney Skrevet 6. juni 2010 Del Skrevet 6. juni 2010 Jeg fant et genialt c program for komprimering av små strenger kalt smaz: http://github.com/antirez/smaz Hvordan kan jeg bruke dette i python programmet mitt? Lenke til kommentar
zotbar1234 Skrevet 6. juni 2010 Del Skrevet 6. juni 2010 Jeg fant et genialt c program for komprimering av små strenger kalt smaz: http://github.com/antirez/smaz Hvordan kan jeg bruke dette i python programmet mitt? Skrive din egen C extension mot det biblioteket i Python? Evt. ved bruk av slike verktøy som SWIG? Lenke til kommentar
Skinney Skrevet 6. juni 2010 Forfatter Del Skrevet 6. juni 2010 Skal prøve SWIG, takk for hjelpen! Lenke til kommentar
Skinney Skrevet 6. juni 2010 Forfatter Del Skrevet 6. juni 2010 Hmm... Når jeg bruker Swig kræsjer programmet når funksjoner fra denne klassen kalles. Noen som vet hvorfor det er tilfellet? Eventuelt hvordan jeg kan fikse det? Dette er koden jeg bruker: indata = "This is a test" outdata = None smaz.smaz_compress(indata, len(indata), outdata, len(indata)) print indata, outdata Programmet kræsjer bare, uten feilmelding... Lenke til kommentar
Skinney Skrevet 6. juni 2010 Forfatter Del Skrevet 6. juni 2010 Hmm... Med å gjøre om Outdata til "" så kræsjer ikke programmet lenger, men Outdata fylles ikke med komprimert tekst, den holder seg rett og slett bare på null... Lenke til kommentar
Skinney Skrevet 6. juni 2010 Forfatter Del Skrevet 6. juni 2010 Ok... Etter litt mer gransking har jeg funnet ut at komprimeringen faktisk skjer, en print av smaz_compress returnerer en int som indikerer lengden på den nye strengen, men det ser ikke ut til at inholdet blir kopiert over i "outdata"... Jeg regner med at feilen ligger i koden under ett sted, men klarer ikke finne hvor :S # This file was automatically generated by SWIG (http://www.swig.org). # Version 1.3.40 # # Do not make changes to this file unless you know what you are doing--modify # the SWIG interface file instead. # This file is compatible with both classic and new-style classes. from sys import version_info if version_info >= (2,6,0): def swig_import_helper(): from os.path import dirname import imp fp = None try: fp, pathname, description = imp.find_module('_smaz', [dirname(__file__)]) except ImportError: import _smaz return _smaz if fp is not None: try: _mod = imp.load_module('_smaz', fp, pathname, description) finally: fp.close() return _mod _smaz = swig_import_helper() del swig_import_helper else: import _smaz del version_info try: _swig_property = property except NameError: pass # Python < 2.2 doesn't have 'property'. def _swig_setattr_nondynamic(self,class_type,name,value,static=1): if (name == "thisown"): return self.this.own(value) if (name == "this"): if type(value).__name__ == 'SwigPyObject': self.__dict__[name] = value return method = class_type.__swig_setmethods__.get(name,None) if method: return method(self,value) if (not static) or hasattr(self,name): self.__dict__[name] = value else: raise AttributeError("You cannot add attributes to %s" % self) def _swig_setattr(self,class_type,name,value): return _swig_setattr_nondynamic(self,class_type,name,value,0) def _swig_getattr(self,class_type,name): if (name == "thisown"): return self.this.own() method = class_type.__swig_getmethods__.get(name,None) if method: return method(self) raise AttributeError(name) def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) try: _object = object _newclass = 1 except AttributeError: class _object : pass _newclass = 0 def smaz_compress(*args): return _smaz.smaz_compress(*args) smaz_compress = _smaz.smaz_compress def smaz_decompress(*args): return _smaz.smaz_decompress(*args) smaz_decompress = _smaz.smaz_decompress Lenke til kommentar
TheMaister Skrevet 7. juni 2010 Del Skrevet 7. juni 2010 (endret) Er ikke dette veldig kjekt å bruke ctypes til egentlig? :x Kompiler library med: gcc -o smaz.so -shared smaz.c -fPIC siden Makefilen ikke gjør det tydeligvis. #!/usr/bin/env python from ctypes import * import sys smaz = cdll.LoadLibrary('smaz.so') c_smaz_compress = smaz.smaz_compress c_smaz_compress.restype = c_int c_smaz_compress.argtypes = [c_char_p, c_int, c_char_p, c_int] c_smaz_decompress = smaz.smaz_decompress c_smaz_decompress.restype = c_int c_smaz_decompress.argtypes = [c_char_p, c_int, c_char_p, c_int] def smaz_compress(string): ibuf = create_string_buffer(str(string)) obuf = create_string_buffer(len(ibuf.value) * 4) c_smaz_compress(ibuf, len(ibuf.value), obuf, sizeof(obuf)) return obuf.value def smaz_decompress(string): ibuf = create_string_buffer(str(string)) obuf = create_string_buffer(len(ibuf.value) * 64) c_smaz_decompress(ibuf, len(ibuf.value), obuf, sizeof(obuf)) return obuf.value lulz = smaz_compress('This is a really cool string ') print 'Compressed:', lulz decom = smaz_decompress(lulz) print 'Uncompressed:', decom Fant en bug i librariet også tror jeg. Prøv å komprimér og dekomprimér med 'Sup guise?!'. Btw, koden din ovenfor setter outdata til None. smaz_* forventer at du allerede har allokert en buffer som funksjonen kan bruke. Dermed segfault når det bruker NULL. Endret 7. juni 2010 av TheMaister Lenke til kommentar
Skinney Skrevet 7. juni 2010 Forfatter Del Skrevet 7. juni 2010 Tusen hjertelig takk for hjelpa TheMaister. Du hadde ikke trengt å gjøre all jobben for meg da, men setter pris på det. Hadde faktisk ikke hørt om ctypes før, tydeligvis ett felt jeg må lese meg opp på. Yeah, har funnet ett par bugs jeg og, håper utvikleren oppdaterer koden etterhvert Lenke til kommentar
Terrasque Skrevet 7. juni 2010 Del Skrevet 7. juni 2010 Kan også legge til (for senere reference) at pyrex også er et alternativ for c <-> python sammenkobling There are tools like SWIG or Python's foreign function library ctypes which can be used for this task without requiring much additional code, but this is limited to making an external library available in Python code. If adjustments to the API are needed, glue code must again be written manually. This is where Pyrex fits in. Pyrex allows the user to write extension modules in a Python-like language which may directly access the external C code. Lenke til kommentar
Skinney Skrevet 16. juni 2010 Forfatter Del Skrevet 16. juni 2010 Okay, sliter litt med å laste biblioteket i windows nå (har selvfølgelig kompilert om til dll med mingw) og laster ved hjelp av windll.LoadLibrary('smaz.dll') Når jeg prøver å bruke smaz_compress får jeg feil: ValueError: Procedure probably called with excess arguments (eller noe i den dur). Dette fungerer dog glimrende på mac'n Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå