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.

Reply via email to