On Thu, Feb 22, 2018 at 11:44 AM, J. Javan <jafarjava...@gmail.com> wrote: > Dear Erik, > > I highly appreciate you for taking the time and helping people. > Basically, we have some mathematical problems in a GUI application > implemented in Qt-C++ which sage is capable of computing them. This is why > we decided to integrate sage in our app. > > However, As you mentioned it is a very complex or even impossible task to > integrate sage into a windows application since sage is a software suit > rather than a python library. > > After googling some, I found another project called SageMathCell which > provides REST interface to a sage server. I guess this is the best of way > achieving what we are looking for. Unless I'm very much mistaken, with > SageMathCell we can run all sage scripts with peace of mind.

I probably wouldn't--depending on what your application does it would only slow things down to be passing data between two executables over the HTTP stack. This may be a relatively easy way but there are betters. If your application already depends fully on Sage (which, granted, is a big dependency), then why not build your application in the Sage + Cygwin environment? There's no reason you couldn't do that, and would allow you to incorporate the Python interpreter directly into your application. Additional, perhaps the C++ component of your application can be refactored into a library, and the GUI component can use PyQT or a similar library, which would simplify building (so long as you have no trouble getting PyQT built against Sage's Python). (Or maybe the C++ component can go away entirely if it's only for the GUI--either way). Beyond that, without seeing your code it's hard to comment much, but I wouldn't overcomplicate things. Again, if Sage is a hard dependency of your project then you might as well build the project fully in Sage's runtime environment. > As mentioned in this tutorial one should URL encode the sage script and POST > it to > http://{IP address of your SageMathCell server}:8888/service. > > This perfectly works however I cannot it get to work for some scripts. > > For instance calling the service with below code works: > > QNetworkRequest request; > > request.setUrl(QUrl("http://192.168.224.130:8888/service";)); > > request.setHeader(QNetworkRequest::ContentTypeHeader, > "application/x-www-form-urlencoded"); > > arrReqBody = "code=print(1+1)"; // This is the sage script which is put in > HTTP body request > > arrReqBody = request.url().toPercentEncoding(arrReqBody, "=()[].:,"); > > QNetworkAccessManager *netMgr = new QNetworkAccessManager(); > > QObject::connect(netMgr, SIGNAL(finished(QNetworkReply*)), this, > SLOT(sageReply(QNetworkReply*))); > > netMgr->post(request, arrReqBody); > > Which returns the result in stdout as shown below: > "{\"execute_reply\": {\"status\": \"ok\", \"execution_count\": 1, > \"user_expressions\": {}, \"payload\": []}, \"success\": true, \"stdout\": > \"2\\n\"}" > > On the other hand, changing sage script to below does not work. > > arrReqBody = > "code='Y=Polyhedron(vertices=[(0,0,0,0,0,0,0,0),(0,0,0,1,0,1,0,1),(0,0,0,1,0,1,1,1),(0,0,0,1,1,1,0,1)])"; > > arrReqBody += "for v in Y.inequality_generator():print v'"; > > > Above HTTP body returns below which states that the script has been > successfully ran but I've no idea why stdout is missing. > > "{\"execute_reply\": {\"status\": \"ok\", \"execution_count\": 1, > \"user_expressions\": {}, \"payload\": []}, \"success\": true}" It looks like you have some extra quoting here. You have arrReqBody="code='...'" So the 'code' in this case is just a string literal '...' that happens to contain the actual code you want. AFAICT there's no reason for those extra single-quotes. Just as guess though. Best, E > My best guess is that there is something wrong about the encoding however no > luck until now. > I would appreciate it if someone could lend me a hand on this. > > Thanks, > Javan > > > > On Wednesday, January 31, 2018 at 5:30:16 PM UTC+3:30, Erik Bray wrote: >> >> On Tue, Jan 30, 2018 at 2:35 PM, J. Javan <jafarj...@gmail.com> wrote: >> > I can see that you have successfully linked against sage. >> > I also have a Qt GUI application which needs to do some mathematics in >> > the >> > background. >> > This application is targeted for windows platforms. I have installed >> > sage >> > from this link. >> > Could you please guide me on how to link my app with sage? >> > >> > I'm running your code as below >> > >> > #include <Python.h> >> > >> > >> > int main(int argc, char *argv[]) >> > >> > { >> > >> > >> > int retVal = 0; >> > >> > Py_Initialize(); >> > >> > PySys_SetArgv(argc, (wchar_t**) argv); >> > >> > printf("1+1:\n"); >> > >> > PyRun_SimpleString("print (1+1)"); >> > >> > printf("Load sage \n"); >> > >> > retVal = PyRun_SimpleString("from sage.all import *"); >> > >> > printf("Factor 2310:\n"); >> > >> > PyRun_SimpleString("print factor(2310)"); >> > >> > Py_Finalize(); >> > >> > return 0; >> > >> > } >> > >> > >> > And this gives me the following output: >> > >> > 1+1: >> > 2 >> > Load sage >> > Traceback (most recent call last): >> > File "<string>", line 1, in <module> >> > ModuleNotFoundError: No module named 'sage' >> > Factor 2310: >> > File "<string>", line 1 >> > print factor(2310) >> > ^ >> > SyntaxError: invalid syntax >> > Press <RETURN> to close this window... >> > >> > The output is clearly stating that sage cannot be found. >> > This is because I have linked to my locally compiled python static >> > libraries(Actually I have downloaded python source code and linked >> > against >> > it.) which are not aware of sage. >> > >> > Also I tried to link against python provided in sage installation but I >> > can't find any "python.lib" in it. >> > I have also set an environment variable $SAGE_LOCAL pointing to >> > "C:\Program >> > Files\SageMath 8.1\runtime\opt\sagemath-8.1\local" but no luck. >> > >> > Environment: >> > Qt_v5.9 >> > Windows 7 >> > Python_v3.6.4 >> > Sage_v8.1 >> >> Hi, >> >> I saw this mail forwarded to sage-devel, but it appears to be missing >> quite a lot of context. What, specifically, is it that you're trying >> to do? >> >> To be clear, Sage for Windows is not just a Python module. It's an >> entire software suite, including its own Python interpreter. All of >> it is complied with Cygwin. You won't be able to "import sage" from >> different Python. >> >> If you're trying to build an application that uses Sage internally >> somehow you have two choices really--build the entire software inside >> Sage's environment (you can do this, for example, from the Sage Shell >> which is really a Cygwin shell in the Sage environment). That is, >> build all your software in Cygwin, linking with the Python in Sage, >> etc. This can be tricky unless you know what you're doing with Sage's >> development environment. >> >> Your other alternative is that you can always call Sage's Python from >> outside Sage (but again, you'll still have to set a few environment >> variables at a minimum), and depending on how Python is integrated >> into your software this could mean anything from running the Python >> interpreter as a subprocess and communicating with it, to dynamically >> linking with the libpython DLL in Sage and running C Python code like >> in your example above. Though to be honest I'm not exactly sure if >> it's possible to link a Cygwin DLL into a non-Cygwin executable. But I >> think maybe it's possible.... >> >> Please let me know more about what you're trying to do though and I >> can probably be of more help. >> >> Best, >> E >> >> >> > On Wednesday, September 14, 2011 at 4:15:58 AM UTC+4:30, Michael >> > Rubinstein >> > wrote: >> >> >> >> Thanks! That worked for me too, though I'm not sure how you decided on >> >> the specific >> >> choices of libraries to link to. >> >> >> >> Mike >> >> >> >> On Sep 13, 6:39 pm, Willem Jan Palenstijn <w...@usecode.org> wrote: >> >> > On Tue, Sep 13, 2011 at 08:46:05AM -0700, Michael Rubinstein wrote: >> >> > >> >> > > I tried adding PySys_SetArgv(argc, argv); after Py_Initialize(); >> >> > > It gets me further but then gives a strange error message: >> >> > >> >> > > Loading the Sage library... >> >> > >> >> > > ------------------------------------------------------------ >> >> > > Unhandled SIGSEGV: A segmentation fault occurred in Sage. >> >> > > This probably occurred because a *compiled* component >> >> > > of Sage has a bug in it (typically accessing invalid memory) >> >> > > or is not properly wrapped with _sig_on, _sig_off. >> >> > > You might want to run Sage under gdb with 'sage -gdb' to debug >> >> > > this. >> >> > > Sage will now terminate (sorry). >> >> > > ------------------------------------------------------------ >> >> > >> >> > I've just tried it here with your embed.c + PySys_SetArgv(argc, >> >> > argv), >> >> > and it >> >> > works for me when I link against libpython2.6 dynamically: >> >> > >> >> > $ gcc -I$SAGE_LOCAL/include/python2.6 embed.c -lpython2.6 -lm -lutil >> >> > -lpthread -ldl -o embed >> >> > $ ./embed >> >> > 1+1: >> >> > 2 >> >> > Load sage >> >> > Factor 2310: >> >> > 2 * 3 * 5 * 7 * 11 >> >> > $ >> >> > >> >> > This is 64 bit linux with sage 4.7.1rc1. >> >> > >> >> > -Willem Jan >> > >> > -- >> > You received this message because you are subscribed to the Google >> > Groups >> > "sage-devel" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> > an >> > email to sage-devel+...@googlegroups.com. >> > To post to this group, send email to sage-...@googlegroups.com. >> > Visit this group at https://groups.google.com/group/sage-devel. >> > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google Groups > "sage-devel" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sage-devel+unsubscr...@googlegroups.com. > To post to this group, send email to sage-devel@googlegroups.com. > Visit this group at https://groups.google.com/group/sage-devel. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at https://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.