Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

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

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

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 av TheMaister
Lenke til kommentar

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

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
  • 2 uker senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...