Help: 64bit python call c and got OSError: exception: access violation writing 0xFFFFFFFF99222A60
Hello! I am using ctypes on Windows to interface with a dll and it works fine on Linux and windows 32-bit python. But, when using 64-bit python, we got error "exception: access violation writing 0x99222A60". Checking our server, it seems work without any problem. but the python gives an error and stop the application. -- c -- class myPythonAPI { public: myPythonAPI(); int createService(const char* serviceName){ /* run our application*/}; } extern "C" { __declspec(dllexport) myPythonAPI* loadInstance(){ return new myPythonAPI(); } __declspec(dllexport) int createService(myPythonAPI* obj, const char* serviceName) { eturn obj->createService(serviceName); }; -- python -- from ctypes import * lib = cdll.LoadLibrary('xxx.dll') lib.createService.argtypes=[c_int,ctypes.c_char_p] lib.createService.restype=ctypes.c_int class myDriver(object): def init(self): self.obj = lib.loadInstance() def create_services(self,servicename): result=lib.createService(self.obj,servicename) return result driver=myDriver() driver.create_services(b"myExample") Thanks for the help Jason -- https://mail.python.org/mailman/listinfo/python-list
Re: Help: 64bit python call c and got OSError: exception: access violation writing 0xFFFFFFFF99222A60
Thanks you very much, fixed the problem :) On Mon, Jan 22, 2018 at 4:28 PM, Random832 wrote: > On Mon, Jan 22, 2018, at 16:00, Jason Qian via Python-list wrote: > > Hello! > > > > I am using ctypes on Windows to interface with a dll and it works fine > > on Linux and windows 32-bit python. But, when using 64-bit python, we > got > > error "exception: access violation writing 0x99222A60". > > You are treating the obj type (myPythonAPI *) as c_int, which is only 32 > bits. You should be using a pointer type instead (ideally you should be > using void * and c_void_p, so Python doesn't need the class definition.) > Don't forget to set lib.loadInstance.restype as well. > > > __declspec(dllexport) myPythonAPI* loadInstance(){ return new > > myPythonAPI(); } > > __declspec(dllexport) int createService(myPythonAPI* obj, const char* > > serviceName) { eturn obj->createService(serviceName); > > > lib = cdll.LoadLibrary('xxx.dll') > > > > lib.createService.argtypes=[c_int,ctypes.c_char_p] > > lib.createService.restype=ctypes.c_int > > > > class myDriver(object): > > def init(self): > > self.obj = lib.loadInstance() > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Help: 64bit python call c and got OSError: exception: access violation writing 0xFFFFFFFF99222A60
Thanks for the help, Jason On Mon, Jan 22, 2018 at 5:41 PM, eryk sun wrote: > On Mon, Jan 22, 2018 at 9:00 PM, Jason Qian via Python-list > wrote: > > > > I am using ctypes on Windows to interface with a dll and it works fine > > on Linux and windows 32-bit python. But, when using 64-bit python, we > got > > error "exception: access violation writing 0x99222A60". > > > > from ctypes import * > > Try to avoid * imports if it's a public module. > > > lib = cdll.LoadLibrary('xxx.dll') > > Just use CDLL directly. cdll.LoadLibrary is pointless, and > `cdll.xxx` is problematic in some cases because it caches CDLL > instances, which cache function pointers. Also, the ".dll" filename > extension isn't required in Windows. > > > lib.createService.argtypes=[c_int,ctypes.c_char_p] > > lib.createService.restype=ctypes.c_int > > > > class myDriver(object): > > def init(self): > > self.obj = lib.loadInstance() > > Since you didn't set loadInstance.restype, the result gets truncated > as a C int, the default result type. > > I recommend defining an opaque ctypes struct (i.e. no defined fields) > for the C++ class. This provides type safety. Staying strict and > literal on types is more work than using a `void *` everywhere, but it > pays off in terms of easier debugging and more resilient code. A > simple example is that ctypes returns a `void *` result (or gets a > struct field or array item) as a Python integer. Then for any FFI call > that you may have forgotten to define argtypes, ctypes will default to > truncating this integer value as a C int. At best that causes an > immediate crash. At worst it's a subtle bug that corrupts data. > > Here's an example implementation with an opaque struct: > > import ctypes > > lib = ctypes.CDLL('xxx') > > class myPythonAPI(ctypes.Structure): > pass > > PmyPythonAPI = ctypes.POINTER(myPythonAPI) > > lib.loadInstance.restype = PmyPythonAPI > lib.loadInstance.argtypes = () > > lib.createService.restype = ctypes.c_int > lib.createService.argtypes = (PmyPythonAPI, ctypes.c_char_p) > > class myDriver(object): > > def init(self): > self.obj = lib.loadInstance() > > def create_services(self, servicename): > return lib.createService(self.obj, servicename) > -- https://mail.python.org/mailman/listinfo/python-list
Re: Help: 64bit python call c and got OSError: exception: access violation writing 0xFFFFFFFF99222A60
Again, thanks for the help. Everything is working fine after the changes. Here is one more new issue needs some help. On c side, The createService function can pass a callback handler as second parameter. Without callback handler, it works fine. But if we add the callback handler, the application will give a exception due to the pointer of callback handler = NULL; Not sure, why the callback handler missed up, when the app calling from python. Thanks -- python lib.createService.argtypes=[ctypes.c_void_p,ctypes.c_char_p] lib.createService.restype=ctypes.c_int def create_services(self,servicename): result=lib.createService(self.obj,servicename) return result --c -- __declspec(dllexport) int createService(void* obj, const char* serviceName) { return ((myPythonAPI*)obj)->createService(serviceName); } int myPythonAPI::createService(const char* serviceName) { //case 1 : //This works fine createService(methodname); //case 2 //This will not working, InvocationCallback serviceCallback; createService(methodname, &serviceCallback); } On Mon, Jan 22, 2018 at 5:58 PM, Jason Qian wrote: > Thanks you very much, fixed the problem :) > > On Mon, Jan 22, 2018 at 4:28 PM, Random832 wrote: > >> On Mon, Jan 22, 2018, at 16:00, Jason Qian via Python-list wrote: >> > Hello! >> > >> > I am using ctypes on Windows to interface with a dll and it works >> fine >> > on Linux and windows 32-bit python. But, when using 64-bit python, we >> got >> > error "exception: access violation writing 0x99222A60". >> >> You are treating the obj type (myPythonAPI *) as c_int, which is only 32 >> bits. You should be using a pointer type instead (ideally you should be >> using void * and c_void_p, so Python doesn't need the class definition.) >> Don't forget to set lib.loadInstance.restype as well. >> >> > __declspec(dllexport) myPythonAPI* loadInstance(){ return new >> > myPythonAPI(); } >> > __declspec(dllexport) int createService(myPythonAPI* obj, const char* >> > serviceName) { eturn obj->createService(serviceName); >> >> > lib = cdll.LoadLibrary('xxx.dll') >> > >> > lib.createService.argtypes=[c_int,ctypes.c_char_p] >> > lib.createService.restype=ctypes.c_int >> > >> > class myDriver(object): >> > def init(self): >> > self.obj = lib.loadInstance() >> -- >> https://mail.python.org/mailman/listinfo/python-list >> > > -- https://mail.python.org/mailman/listinfo/python-list
Python call c pass a callback function on Linux
Hi, I have following code that works fine on windows. InvocationCB=WINFUNCTYPE(None, c_char_p, c_int) submit = lib.submit submit.argtypes = [ctypes.c_void_p, c_void_p,InvocationCB] submit.restype = ctypes.c_int def handleResponse(message, code): print('--- handleResponse ---') print(message) print(code) class GSPythonDriver(object): def submif(self,methodname) invm_fn = InvocationCB(handleResponse) lib.submit(self.obj,methodname,invm_fn) How can I do this on the Linux ? Thanks for the help Jason -- https://mail.python.org/mailman/listinfo/python-list
Re: Python call c pass a callback function on Linux
HI Dennis, Thanks for the help, After changing WINFUNCTYPE to CFUNCTYPE, the call back function works on the Linux :) Thanks again, Jason On Wed, Jan 24, 2018 at 6:15 PM, Dennis Lee Bieber wrote: > On Wed, 24 Jan 2018 17:16:22 -0500, Jason Qian via Python-list > declaimed the following: > > >Hi, > > > > I have following code that works fine on windows. > > > You have not provided a minimal functional example... > > >InvocationCB=WINFUNCTYPE(None, c_char_p, c_int) > >submit = lib.submit > > Where did lib.submit come from? No import statements are shown. > > >submit.argtypes = [ctypes.c_void_p, c_void_p,InvocationCB] > >submit.restype = ctypes.c_int > > > > You are setting things on the name submit yet... > > >def handleResponse(message, code): > > print('--- handleResponse ---') > > print(message) > > print(code) > > > >class GSPythonDriver(object): > > def submif(self,methodname) > > Is that a typo for submit? > > >invm_fn = InvocationCB(handleResponse) > >lib.submit(self.obj,methodname,invm_fn) > > ... down here you are referring back to the full lib.submit (which may be > the same object) > > > No example instance of GSPythonDriver is created, and thereby > nothing > defined within it is invoked... > > However, the one thing that stands out is that WINFUNCTYPE is > Windows > "stdcall" specific, and ctypes defines CFUNCTYPE for the more global C > calling conventions. But from there? You have to specify the proper library > containing the functions you are invoking... Is that library (or > equivalent) even available on your proposed target OS? > > > -- > Wulfraed Dennis Lee Bieber AF6VN > wlfr...@ix.netcom.comHTTP://wlfraed.home.netcom.com/ > > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Help: 64bit python call c and got OSError: exception: access violation writing 0xFFFFFFFF99222A60
Figured it out, Thanks On Wed, Jan 24, 2018 at 4:25 PM, Jason Qian wrote: > Again, thanks for the help. Everything is working fine after the changes. > > Here is one more new issue needs some help. > > On c side, > >The createService function can pass a callback handler as second > parameter. >Without callback handler, it works fine. But if we add the callback > handler, the application will give a exception due to the pointer of > callback handler = NULL; > >Not sure, why the callback handler missed up, when the app calling from > python. > > Thanks > > -- python > > lib.createService.argtypes=[ctypes.c_void_p,ctypes.c_char_p] > lib.createService.restype=ctypes.c_int > > def create_services(self,servicename): > result=lib.createService(self.obj,servicename) > return result > > --c -- > > __declspec(dllexport) int createService(void* obj, const char* > serviceName) > { > return ((myPythonAPI*)obj)->createService(serviceName); > } > > int myPythonAPI::createService(const char* serviceName) > { > //case 1 : > //This works fine > createService(methodname); > > //case 2 > //This will not working, > InvocationCallback serviceCallback; > createService(methodname, &serviceCallback); > } > > > > > > > > > > > > On Mon, Jan 22, 2018 at 5:58 PM, Jason Qian wrote: > >> Thanks you very much, fixed the problem :) >> >> On Mon, Jan 22, 2018 at 4:28 PM, Random832 >> wrote: >> >>> On Mon, Jan 22, 2018, at 16:00, Jason Qian via Python-list wrote: >>> > Hello! >>> > >>> > I am using ctypes on Windows to interface with a dll and it works >>> fine >>> > on Linux and windows 32-bit python. But, when using 64-bit python, we >>> got >>> > error "exception: access violation writing 0x99222A60". >>> >>> You are treating the obj type (myPythonAPI *) as c_int, which is only 32 >>> bits. You should be using a pointer type instead (ideally you should be >>> using void * and c_void_p, so Python doesn't need the class definition.) >>> Don't forget to set lib.loadInstance.restype as well. >>> >>> > __declspec(dllexport) myPythonAPI* loadInstance(){ return new >>> > myPythonAPI(); } >>> > __declspec(dllexport) int createService(myPythonAPI* obj, const char* >>> > serviceName) { eturn obj->createService(serviceName); >>> >>> > lib = cdll.LoadLibrary('xxx.dll') >>> > >>> > lib.createService.argtypes=[c_int,ctypes.c_char_p] >>> > lib.createService.restype=ctypes.c_int >>> > >>> > class myDriver(object): >>> > def init(self): >>> > self.obj = lib.loadInstance() >>> -- >>> https://mail.python.org/mailman/listinfo/python-list >>> >> >> > -- https://mail.python.org/mailman/listinfo/python-list
Please help on print string that contains 'tab' and 'newline'
HI I am a string that contains \r\n\t [Ljava.lang.Object; does not exist*\r\n\t*at com.livecluster.core.tasklet I would like it print as : [Ljava.lang.Object; does not exist tat com.livecluster.core.tasklet -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
HI I have a string that contains \r\n\t [Ljava.lang.Object; does not exist*\r\n\t*at com.livecluster.core.tasklet I would like to print it as : [Ljava.lang.Object; does not exist tat com.livecluster.core.tasklet How can I do this in python print ? Thanks On Sat, Jan 27, 2018 at 3:15 PM, Jason Qian wrote: > HI > >I am a string that contains \r\n\t > >[Ljava.lang.Object; does not exist*\r\n\t*at > com.livecluster.core.tasklet > > >I would like it print as : > > [Ljava.lang.Object; does not exist > tat com.livecluster.core.tasklet > > > -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
Thanks for taking look this. 1. Python pass a function to c side as callback, and print out the message. def handleError(message, code): print('** handleError **') * print('exception ' + str(message))* 2. On c side : send stack trace back to python by calling the callback function Callback::Callback(InvocationER rcb) : _rcb(rcb) { } void Callback::handleError(Exception &e, int taskId) { *(_rcb)((char*)e.getStackTrace().c_str(), taskId);* } So, the source of the string is std::string. On the python side is byte array. Ljava.lang.Object; does not exist*\r\n\t*at com Thanks On Sat, Jan 27, 2018 at 4:20 PM, Ned Batchelder wrote: > On 1/27/18 3:15 PM, Jason Qian via Python-list wrote: > >> HI >> >> I am a string that contains \r\n\t >> >> [Ljava.lang.Object; does not exist*\r\n\t*at >> com.livecluster.core.tasklet >> >> >> I would like it print as : >> >> [Ljava.lang.Object; does not exist >>tat com.livecluster.core.tasklet >> > > It looks like you are doing something that is a little bit, and perhaps a > lot, more complicated than printing a string. Can you share the code that > is trying to produce that output? > > --Ned. > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
Thanks for taking look this. The source of the string is std::string from our c code as callback . On the python side is shows as bytes. Is there way we can reformat the string that replace \r\n with newline, so python can correctly print it ? Thanks On Sat, Jan 27, 2018 at 5:39 PM, Terry Reedy wrote: > On 1/27/2018 3:15 PM, Jason Qian via Python-list wrote: > >> HI >> >> I am a string that contains \r\n\t >> >> [Ljava.lang.Object; does not exist*\r\n\t*at >> com.livecluster.core.tasklet >> >> >> I would like it print as : >> >> [Ljava.lang.Object; does not exist >>tat com.livecluster.core.tasklet >> > > Your output does not match the input. Don't add, or else remove, the *s > if you don't want to see them. Having '\t' print as ' t' makes no sense. > > In IDLE > > >>> print('[Ljava.lang.Object; does not exist*\r\n\t*at > com.livecluster.core.tasklet') > [Ljava.lang.Object; does not exist* > *at com.livecluster.core.tasklet > > IDLE ignores \r, other display mechanisms may not. You generally should > not use it. > > Pasting the text, with the literal newline embedded, does not work in > Windows interactive interpreter, so not testing this there. > > > -- > Terry Jan Reedy > > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
there are 0D 0A 09 %c %d 116 *%c %d 13%c %d 10%c %d 9* %c %d 97 On Sat, Jan 27, 2018 at 9:05 PM, Dennis Lee Bieber wrote: > On Sat, 27 Jan 2018 20:33:58 -0500, Jason Qian via Python-list > declaimed the following: > > > Ljava.lang.Object; does not exist*\r\n\t*at com > > > > Does that source contain > > 0x0d 0x0a 0x09 > > > or is it really > > 0x5c 0x72 0x5c 0x61 0x5c 0x74 > \r\n\t > > as individual characters? > > > >>> bks = chr(0x5c) > >>> ar = "r" > >>> en = "n" > >>> te = "t" > >>> > >>> strn = "".join([bks, ar, bks, en, bks, te]) > >>> strn > '\\r\\n\\t' > >>> print strn > \r\n\t > >>> cstr = "\r\n\t" > >>> cstr > '\r\n\t' > >>> print cstr > > > >>> > > -- > Wulfraed Dennis Lee Bieber AF6VN > wlfr...@ix.netcom.comHTTP://wlfraed.home.netcom.com/ > > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
print(repr(message)) out : *does not exist\r\n\tat com.* for ch in message: printf("%d %c",ch, chr(ch)) %d %c 110 n %d %c 111 o %d %c 116 t %d %c 32 %d %c 101 e %d %c 120 x %d %c 105 i %d %c 115 s %d %c 116 t *%d %c 13%d %c 10* *%d %c 9* %d %c 97 a %d %c 116 t %d %c 32 %d %c 99 c %d %c 111 o %d %c 109 m On Sun, Jan 28, 2018 at 9:50 AM, Steven D'Aprano < steve+comp.lang.pyt...@pearwood.info> wrote: > On Sat, 27 Jan 2018 21:23:02 -0500, Jason Qian via Python-list wrote: > > > there are 0D 0A 09 > > If your string actually contains CARRIAGE RETURN (OD) NEWLINE (OA), and > TAB (09) characters, then you don't need to do anything. Just call print, > and they will be printed correctly. > > If that doesn't work, then your input string doesn't contain what you > think it contains. Please call this: > > print(repr(the_string)) > > and COPY AND PASTE the output here so we can see it. > > > > -- > Steve > > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
Thanks a lot :) os.write(1, message) works ! On Sun, Jan 28, 2018 at 8:04 PM, Dan Stromberg wrote: > How about: > >>> os.write(1, message) > > On Sun, Jan 28, 2018 at 4:51 PM, Jason Qian via Python-list > wrote: > > print(repr(message)) out : > > > > *does not exist\r\n\tat com.* > > > > > > for ch in message: > > printf("%d %c",ch, chr(ch)) > > > > > > %d %c 110 n > > %d %c 111 o > > %d %c 116 t > > %d %c 32 > > %d %c 101 e > > %d %c 120 x > > %d %c 105 i > > %d %c 115 s > > %d %c 116 t > > > > *%d %c 13%d %c 10* > > *%d %c 9* > > %d %c 97 a > > %d %c 116 t > > %d %c 32 > > %d %c 99 c > > %d %c 111 o > > %d %c 109 m > -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
Thanks Peter, replace print with os.write fixed the problem. On Sun, Jan 28, 2018 at 3:57 AM, Peter Otten <__pete...@web.de> wrote: > Jason Qian via Python-list wrote: > > > HI > > > >I have a string that contains \r\n\t > > > >[Ljava.lang.Object; does not exist*\r\n\t*at > >[com.livecluster.core.tasklet > > > > > >I would like to print it as : > > > > [Ljava.lang.Object; does not exist > > tat com.livecluster.core.tasklet > > > > How can I do this in python print ? > > Assuming the string contains the escape sequences rather than an actual > TAB, CR or NL you can apply codecs.decode(): > > >>> s = r"[Ljava.lang.Object; does not exist\r\n\tat > com.livecluster.core.tasklet" > >>> print(s) > [Ljava.lang.Object; does not exist\r\n\tat com.livecluster.core.tasklet > >>> import codecs > >>> print(codecs.decode(s, "unicode-escape")) > [Ljava.lang.Object; does not exist > at com.livecluster.core.tasklet > > Note that this will decode all escape sequences that may occur in a string > literal > in Python, e. g. > > >>> codecs.decode(r"\x09 \u03c0 \N{soft ice cream}", "unicode-escape") > '\t π 🍦' > > and will complain when the string is not a valid Python string literal: > > >>> codecs.decode(r"\x", "unicode-escape") > Traceback (most recent call last): > File "", line 1, in > UnicodeDecodeError: 'unicodeescape' codec can't decode bytes in position > 0-1: truncated \xXX escape > > If you need more control you can build your own conversion routine: > > import re > > lookup = { > "r": "\r", > "n": "\n", > "t": "\t", > } > > def substitute(match): > group = match.group(1) > return lookup.get(group, group) > > def decode(s): > return re.sub(r"\\(.)", substitute, s) > > s = decode("alpha\\n \\xomega") > print(s) > print(repr(s)) > > > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Re: Please help on print string that contains 'tab' and 'newline'
The message type is bytes, this may make different ? print(type(message)) On Sun, Jan 28, 2018 at 8:41 PM, Steven D'Aprano < steve+comp.lang.pyt...@pearwood.info> wrote: > On Sun, 28 Jan 2018 20:31:39 -0500, Jason Qian via Python-list wrote: > > > Thanks a lot :) > > > > os.write(1, message) works ! > > I still do not believe that print(message) doesn't work. I can see no > reason why you need to use os.write(). > > > > > -- > Steve > > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Help on convert PyObject to string (c) Python 3.6
Hi, This is the case of calling python from c and the python function will return a string. It seems python been called correctly, but got error when convert the python string to c string. -- c -- PyObject* pValue = PyObject_CallObject(pFunc, pArgs); -- python -- import string, random def StringGen(argv): out_string_size=int(argv); output_data=''.join(random.choice(string.ascii_lowercase) for x in range(out_string_size)) return output_data I try: PyObject* pValue = PyObject_CallObject(pFunc, pArgs); const char* sp = 0; if (!PyArg_ParseTuple(pValue, "s", &sp)) { } and got "SystemError: new style getargs format but argument is not a tuple" Thanks for the help -- https://mail.python.org/mailman/listinfo/python-list
Re: Help on convert PyObject to string (c) Python 3.6
Hi Chris, Thanks a lot ! Using PyUnicode_DecodeUTF8 fix the problem. On Sun, Feb 4, 2018 at 12:02 PM, Chris Angelico wrote: > On Mon, Feb 5, 2018 at 3:52 AM, Jason Qian via Python-list > wrote: > > Hi, > > > >This is the case of calling python from c and the python function > will > > return a string. > > > >It seems python been called correctly, but got error when convert the > > python string to c string. > > > > -- c -- > > > >PyObject* pValue = PyObject_CallObject(pFunc, pArgs); > > > > > > -- python -- > > > > import string, random > > def StringGen(argv): > > out_string_size=int(argv); > > output_data=''.join(random.choice(string.ascii_lowercase) for x in > > range(out_string_size)) > > return output_data > > > > > > I try: > > > > PyObject* pValue = PyObject_CallObject(pFunc, pArgs); > > const char* sp = 0; > > if (!PyArg_ParseTuple(pValue, "s", &sp)) { > > } > > > > and got > > > > "SystemError: new style getargs format but argument is not a tuple" > > > > You're using something that is specifically for parsing *arguments* > (as indicated by the "PyArg" prefix). If you want to get a 'const char > *' from a Python string, you probably want to encode it UTF-8. There's > a convenience function for that: > > https://docs.python.org/3/c-api/unicode.html#c.PyUnicode_AsUTF8AndSize > > And if you know for sure that there won't be any \0 in the string, you > can use the next function in the docs, which doesn't bother returning > the size. (It'll always be null-terminated.) > > ChrisA > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Help on PyImport_Import(pNAme)
Hi, This only works when loading modules from the current directory. Is there a way I can load from somewhere else ? Thanks for help, -- https://mail.python.org/mailman/listinfo/python-list
Re: Help on convert PyObject to string (c) Python 3.6
Thanks a lot and I will take a look Cython, On Mon, Feb 19, 2018 at 3:23 PM, Stefan Behnel wrote: > Jason Qian via Python-list schrieb am 04.02.2018 um 17:52: > >This is the case of calling python from c and the python function > will > > return a string. > > Hi Jason, > > I noticed that you ran into a couple of problems using the C-API, so I > suggest looking into Cython instead. It basically translates Python to C > and supports optional static usage of C and C++ data types, so you get all > the native code interaction *and* all the Python interaction and features, > without having to go through the hassle of learning how the Python > internals work (and why they don't work for you). The code it generates is > probably also faster and safer than what you are currently writing (no > offence, just experience from reading and writing a lot of such code). > > http://cython.org/ > > Stefan > > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
How to link to python 3.6.4 library on linux ?
Hi, I am calling python from a c application. It compiles and works fine on the windows. How do I compile and link it on the linux for Python 3.6.4 ? Under python dir, it only have a static library, /opt/Python-3.6.4*/lib*/*libpython3.6m.a* * If I link to it, I got:* */opt/Python-3.6.4/lib/libpython3.6m.a(abstract.o): relocation R_X86_64_32S against `_Py_NotImplementedStruct' can not be used when making a shared object; recompile with -fPIC* */opt/Python-3.6.4/lib/libpython3.6m.a: could not read symbols: Bad value* *Thanks for the help,* -- https://mail.python.org/mailman/listinfo/python-list
Re: How to link to python 3.6.4 library on linux ?
Thanks Chris, I think I figured it out that when build python on Linux, we need to enable-shared. Thanks again, On Mon, Feb 19, 2018 at 5:04 PM, Chris Angelico wrote: > On Tue, Feb 20, 2018 at 8:07 AM, Jason Qian via Python-list > wrote: > > Hi, > > > > I am calling python from a c application. > > It compiles and works fine on the windows. How do I compile and > link > > it on the linux for Python 3.6.4 ? > > > > Under python dir, it only have a static library, > > > >/opt/Python-3.6.4*/lib*/*libpython3.6m.a* > > > > * If I link to it, I got:* > > > > */opt/Python-3.6.4/lib/libpython3.6m.a(abstract.o): relocation > R_X86_64_32S > > against `_Py_NotImplementedStruct' can not be used when making a shared > > object; recompile with -fPIC* > > */opt/Python-3.6.4/lib/libpython3.6m.a: could not read symbols: Bad > value* > > > > By "calling Python from C", do you mean what the docs call "embedding"? > > https://docs.python.org/3/extending/embedding.html > > I would recommend following the tutorial there, if you haven't > already. If you have, and the tutorial code doesn't work for you, post > your code and what you did, and we'll try to help with that. > > ChrisA > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Help on ctypes.POINTER for Python array
Hi, Need some help, in the Python, I have a array of string var_array=["Opt1=DG","Opt1=DG2"] I need to call c library and pass var_array as parameter In the argtypes, how do I set up ctypes.POINTER(???) for var_array? func.argtypes=[ctypes.c_void_p,ctypes.c_int, ctypes.POINTER()] In the c code: int func (void* obj, int index, char** opt) Thanks Jason -- https://mail.python.org/mailman/listinfo/python-list
Re: Help on ctypes.POINTER for Python array
Awesome, thanks! On Thu, May 11, 2023 at 1:47 PM Eryk Sun wrote: > On 5/11/23, Jason Qian via Python-list wrote: > > > > in the Python, I have a array of string > > var_array=["Opt1=DG","Opt1=DG2"] > > I need to call c library and pass var_array as parameter > > In the argtypes, how do I set up ctypes.POINTER(???) for var_array? > > > > func.argtypes=[ctypes.c_void_p,ctypes.c_int, ctypes.POINTER()] > > > > In the c code: > > int func (void* obj, int index, char** opt) > > The argument type is ctypes.POINTER(ctypes.c_char_p), but that's not > sufficient. It doesn't implement converting a list of str objects into > an array of c_char_p pointers that reference byte strings. You could > write a wrapper function that implements the conversion before calling > func(), or you could set the argument type to a custom subclass of > ctypes.POINTER(ctypes.c_char_p) that implements the conversion via the > from_param() class method. > > https://docs.python.org/3/library/ctypes.html#ctypes._CData.from_param > > Here's an example of the latter. > > C library: > > #include > > int > func(void *obj, int index, char **opt) > { > int length; > for (length=0; opt[length]; length++); > if (index < 0 || index >= length) { > return -1; > } > return printf("%s\n", opt[index]); > } > > > Python: > > import os > import ctypes > > lib = ctypes.CDLL('./lib.so') > BaseOptions = ctypes.POINTER(ctypes.c_char_p) > > class Options(BaseOptions): > @classmethod > def from_param(cls, param): > if isinstance(param, list): > new_param = (ctypes.c_char_p * (len(param) + 1))() > for i, p in enumerate(param): > new_param[i] = os.fsencode(p) > param = new_param > return BaseOptions.from_param(param) > > lib.func.argtypes = (ctypes.c_void_p, ctypes.c_int, Options) > > > demo: > > >>> opts = ['Opt1=DG', 'Opt1=DG2'] > >>> lib.func(None, 0, opts) > Opt1=DG > 8 > >>> lib.func(None, 1, opts) > Opt1=DG2 > 9 > -- https://mail.python.org/mailman/listinfo/python-list
Help on ImportError('Error: Reinit is forbidden')
Hi, I Need some of your help. I have the following C code to import *Import python.* It works 99% of the time, but sometimes receives "*ImportError('Error: Reinit is forbidden')*". error. **We run multiple instances of the app parallelly. *** Python version(3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] PyObject * importPythonModule(const char* pmodName) { const char* errors = NULL; int nlen = strlen(pmodName); PyObject *pName = PyUnicode_DecodeUTF8(pmodName, nlen, errors); PyObject *pModule = *PyImport_Import*(pName); Py_DECREF(pName); if (pModule == NULL) { if (*PyErr_Occurred*()) { handleError("PyImport_Import()"); } } } void handleError(const char* msg) { ... "PyImport_Import() - ImportError('Error: Reinit is forbidden')" } Thanks Jason -- https://mail.python.org/mailman/listinfo/python-list
Re: Help on ImportError('Error: Reinit is forbidden')
Hi Barry, void handleError(const char* msg) { ... PyErr_Fetch(&pyExcType, &pyExcValue, &pyExcTraceback); PyErr_NormalizeException(&pyExcType, &pyExcValue, &pyExcTraceback); PyObject* str_value = PyObject_Repr(pyExcValue); PyObject* pyExcValueStr = PyUnicode_AsEncodedString(str_value, "utf-8", "Error ~"); const char **strErrValue* = PyBytes_AS_STRING(pyExcValueStr); //where *strErrValue* = "ImportError('Error: Reinit is forbidden')" ... } What we imported is a Python file which import some pyd libraries. Thanks Jason On Thu, May 18, 2023 at 3:53 AM Barry wrote: > > > > On 17 May 2023, at 20:35, Jason Qian via Python-list < > python-list@python.org> wrote: > > > > Hi, > > > > I Need some of your help. > > > > I have the following C code to import *Import python.* It works 99% of > > the time, but sometimes receives "*ImportError('Error: Reinit is > > forbidden')*". error. > > **We run multiple instances of the app parallelly. > > > > *** Python version(3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC > > v.1914 64 bit (AMD64)] > > > > PyObject * importPythonModule(const char* pmodName) > > { > >const char* errors = NULL; > > int nlen = strlen(pmodName); > > PyObject *pName = PyUnicode_DecodeUTF8(pmodName, nlen, errors); > > PyObject *pModule = *PyImport_Import*(pName); > > Py_DECREF(pName); > > if (pModule == NULL) { > > if (*PyErr_Occurred*()) { > >handleError("PyImport_Import()"); > > } > > } > > } > > void handleError(const char* msg) > > { > > ... > > "PyImport_Import() - ImportError('Error: Reinit is forbidden')" > > } > > You do not seem to printing out msg, you have assumed it means reinit it > seems. > What does msg contain when it fails? > > Barry > > > > > > Thanks > > Jason > > -- > > https://mail.python.org/mailman/listinfo/python-list > > > > -- https://mail.python.org/mailman/listinfo/python-list
ModuleNotFoundError: No module named 'encodings'
Hi Need some help. I have a C++ application that invokes Python. ... Py_SetPythonHome("python_path"); Py_Initialize(); This works fine on Python 3.6.4 version, but got errors on Python 3.7.0 when calling Py_Initialize(), Fatal Python error: initfsencoding: unable to load the file system codec ModuleNotFoundError: No module named 'encodings' Thanks for the help Jason -- https://mail.python.org/mailman/listinfo/python-list
Re: ModuleNotFoundError: No module named 'encodings'
Thanks Thomas, You are right, this seems the Python home configuration issue. One more question. Is there a way I can catch the error ( Fatal Python error: initfsencoding: ..) as exception in the c code ? try{ Py_Initialize(); }catch(xxx) { } Thanks On Thu, Sep 6, 2018 at 5:29 PM, Thomas Jollans wrote: > On 09/06/2018 09:46 PM, Jason Qian via Python-list wrote: > >> Hi >> >> Need some help. >> >> I have a C++ application that invokes Python. >> >> ... >> Py_SetPythonHome("python_path"); >> > > This isn't actually a line in your code, is it? For one thing, > Py_SetPythonHome expects a wchar_t*... > > Py_Initialize(); >> >> This works fine on Python 3.6.4 version, but got errors on Python 3.7.0 >> when calling Py_Initialize(), >> >> Fatal Python error: initfsencoding: unable to load the file system codec >> ModuleNotFoundError: No module named 'encodings' >> > > So, Python can't find a core module. This either means your Python 3.7 > build is broken, or it doesn't know where to look. Perhaps whatever it is > you're actually passing to Py_SetPythonHome needs to be changed to point to > the right place? (i.e. maybe you're giving it the location of the Python > 3.6 library rather than the Python 3.7 one) > > -- Thomas > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
Help on PyList 3.7.0
Hey, Need some help on PyList. #get path PyObject *path = PyObject_GetAttrString(sys, "path"); #new user path PyObject* newPath = PyUnicode_DecodeUTF8(userPath, strlen( userPath ), errors); #append newPath to path PyList_Append(path, newPath); How to check if the newPath is already in the path ? So, If the path contains the newPath, I will not append the newpath. Thanks for help -- https://mail.python.org/mailman/listinfo/python-list
Re: Help on PyList 3.7.0
Thanks a lot. On Thu, Sep 13, 2018 at 5:24 PM, MRAB wrote: > On 2018-09-13 21:50, Jason Qian via Python-list wrote: > >> Hey, >> >> Need some help on PyList. >> >> >> #get path >> PyObject *path = PyObject_GetAttrString(sys, "path"); >> >> #new user path >> PyObject* newPath = PyUnicode_DecodeUTF8(userPath, strlen( userPath ), >> errors); >> >> #append newPath to path >> PyList_Append(path, newPath); >> >> How to check if the newPath is already in the path ? >> >> So, If the path contains the newPath, I will not append the newpath. >> >> >> Thanks for help >> >> A list is a sequence. Use PySequence_Contains. > -- > https://mail.python.org/mailman/listinfo/python-list > -- https://mail.python.org/mailman/listinfo/python-list
how to get string printed by PyErr_Print( )
Hey, Someone has discussed this issue before. Other than redirect stderr, does the new version python 3.7.0 has other way to retrieve the string whichPyErr_Print( ) ? if (PyErr_Occurred()) PyErr_Print(); //need to retrieve the error to string Thanks -- https://mail.python.org/mailman/listinfo/python-list