How to execute foreing code from Python

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

How to execute foreing code from Python

hidura
Hello i want to code from different languages using a Python script i know i can use os.system, but i don't know how to receive data or send arguments using that method if theres any another way to make it or there's a way to send arguments and receive data using os.system?

Thanks in advance.
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: How to execute foreing code from Python

Chris Rebert-6
On Sun, Jan 23, 2011 at 2:21 PM,  <[hidden email]> wrote:
> Hello i want to code from different languages using a Python script i know i
> can use os.system, but i don't know how to receive data or send arguments
> using that method if theres any another way to make it or there's a way to
> send arguments and receive data using os.system?

Which other languages specifically?
Also, the `subprocess` module
(http://docs.python.org/library/subprocess.html ) is preferred over
os.system().

Cheers,
Chris
--
http://blog.rebertia.com
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: How to execute foreing code from Python

Dave Angel
In reply to this post by hidura
On 01/-10/-28163 02:59 PM, [hidden email] wrote:
> Hello i want to code from different languages using a Python script i
> know i can use os.system, but i don't know how to receive data or send
> arguments using that method if theres any another way to make it or
> there's a way to send arguments and receive data using os.system?
>
> Thanks in advance.
>

That sentence runs on, and makes no sense to me.  But I can guess that
you would like to be able to write code in other languages, and call it
from within a Python script.

If you're on Windows, and the other language is a compiled one like C,
compile it into a DLL, and call that DLL from Python.  Ctypes is the
first module to study.

If you're on Linux, and the code in the other language was written by
someone else, and is already compiled into an executable you cannot
change, you probably should invoke it using the subprocess module.  You
can supply information to the executable via the commandline arguments
and also via stdin, and you can receive results via the exit code, and
via stdout.

Any more details and options would need lots more information about your
environment and your constraints.

DaveA
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: How to execute foreing code from Python

Dan Stromberg-2
On Sun, Jan 23, 2011 at 4:24 PM, Dave Angel <[hidden email]> wrote:

> On 01/-10/-28163 02:59 PM, [hidden email] wrote:
>>
>> Hello i want to code from different languages using a Python script i
>> know i can use os.system, but i don't know how to receive data or send
>> arguments using that method if theres any another way to make it or
>> there's a way to send arguments and receive data using os.system?
>>
>> Thanks in advance.
>>
>
> That sentence runs on, and makes no sense to me.  But I can guess that you
> would like to be able to write code in other languages, and call it from
> within a Python script.

Well, clearly it made some sense, or you wouldn't be responding.

> If you're on Windows, and the other language is a compiled one like C,
> compile it into a DLL, and call that DLL from Python.  Ctypes is the first
> module to study.

The DLL is but a weak mimicry of what *ix had for a long time before.
On most *ix's, the .so is the analog to the windows DLL, though only
AIX appears to suffer from the same kind of "DLL hell" that windows
suffers from (which makes some historical if not technical sense,
given that windows is related to OS/2, which like AIX is also from
IBM).  Using a .so, you can still use ctypes.  You also have the
option of using Cython, which is perhaps a bit better supported on
*ix, but will likely now work on windows too.

> If you're on Linux, and the code in the other language was written by
> someone else, and is already compiled into an executable you cannot change,

This is rare on Linux - almost everything is changeable on Linux,
because it is almost entirely opensource - sometimes entirely so,
depending on distribution choice and what 3rd party apps you install
after the OS install.

> you probably should invoke it using the subprocess module.

This is an option on almost any OS, and in fact is probably a pretty
good one on almost any OS, even if you do have source.  Sadly, few
windows programs are written to take advantage of this, perhaps
because of the historical (dos/windows) command.com's fake pipes.

You can communicate with a subprocess using pipes, or command line
arguments, or files, or sockets, or shared memory.  There are probably
other options that aren't coming to mind just now.  But usually, using
pipes gives the loosest (best) coupling between processes.

Microsoft appears to have recognized this to some extent by releasing
powershell - though it uses object pipes rather than byte stream
pipes.  Object pipes appear to require less serialization, but also
appear to be less loosely coupled.  For remote pipes, powershell
serializes to XML, while *ix pipes serialize exactly the same way
remote local or remote.
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: How to execute foreing code from Python

hidura
Thanks to all for your fast responses. I will use this on a server
running on Linux, so there is no problem with the OS and probably i
will try to pipes and subprocess, but the pipes worry me because i
can't stop the process using timeout or i don't found how to stop
it...


2011/1/23, Dan Stromberg <[hidden email]>:

> On Sun, Jan 23, 2011 at 4:24 PM, Dave Angel <[hidden email]> wrote:
>> On 01/-10/-28163 02:59 PM, [hidden email] wrote:
>>>
>>> Hello i want to code from different languages using a Python script i
>>> know i can use os.system, but i don't know how to receive data or send
>>> arguments using that method if theres any another way to make it or
>>> there's a way to send arguments and receive data using os.system?
>>>
>>> Thanks in advance.
>>>
>>
>> That sentence runs on, and makes no sense to me.  But I can guess that you
>> would like to be able to write code in other languages, and call it from
>> within a Python script.
>
> Well, clearly it made some sense, or you wouldn't be responding.
>
>> If you're on Windows, and the other language is a compiled one like C,
>> compile it into a DLL, and call that DLL from Python.  Ctypes is the first
>> module to study.
>
> The DLL is but a weak mimicry of what *ix had for a long time before.
> On most *ix's, the .so is the analog to the windows DLL, though only
> AIX appears to suffer from the same kind of "DLL hell" that windows
> suffers from (which makes some historical if not technical sense,
> given that windows is related to OS/2, which like AIX is also from
> IBM).  Using a .so, you can still use ctypes.  You also have the
> option of using Cython, which is perhaps a bit better supported on
> *ix, but will likely now work on windows too.
>
>> If you're on Linux, and the code in the other language was written by
>> someone else, and is already compiled into an executable you cannot
>> change,
>
> This is rare on Linux - almost everything is changeable on Linux,
> because it is almost entirely opensource - sometimes entirely so,
> depending on distribution choice and what 3rd party apps you install
> after the OS install.
>
>> you probably should invoke it using the subprocess module.
>
> This is an option on almost any OS, and in fact is probably a pretty
> good one on almost any OS, even if you do have source.  Sadly, few
> windows programs are written to take advantage of this, perhaps
> because of the historical (dos/windows) command.com's fake pipes.
>
> You can communicate with a subprocess using pipes, or command line
> arguments, or files, or sockets, or shared memory.  There are probably
> other options that aren't coming to mind just now.  But usually, using
> pipes gives the loosest (best) coupling between processes.
>
> Microsoft appears to have recognized this to some extent by releasing
> powershell - though it uses object pipes rather than byte stream
> pipes.  Object pipes appear to require less serialization, but also
> appear to be less loosely coupled.  For remote pipes, powershell
> serializes to XML, while *ix pipes serialize exactly the same way
> remote local or remote.
>

--
Enviado desde mi dispositivo móvil

Diego I. Hidalgo D.
--
http://mail.python.org/mailman/listinfo/python-list
Reply | Threaded
Open this post in threaded view
|

Re: How to execute foreing code from Python

hidura
Hello, i understand how to execute a command on the terminal in linux, but what i can't get it is the execution of programs and send the data as arguments, the problem is that i can't execute the program and when i execute the program give me an error with the stdin...

This is the code:

                argPath = "test1"
                args = open(argPath, 'w')
                       
                if self.extract.getByAttr(self.block, 'name', 'args') != None:
                    args.write("<request>"+self.extract.getByAttr(self.block, 'name', 'args')[0].toxml()+"</request>")
                else:
                    args.write('')
               
                car = Popen(shlex.split('python3.1 /home/hidura/webapps/karinapp/Suite/ForeingCode/saveCSS.py', stdin=args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
                args.close()
               
                dataOut = car.stdout.read().decode()
                log = car.stderr.read().decode()
               
               
                if dataOut!='':
                    return dataOut.split('\n')
                   
                elif log != '':
                    return log.split('\n')[0]
               
                else:
                    return None

And the code from the saveCSS.py

from xml.dom.minidom import parseString
import os
import sys

class savCSS:
        """This class has to save
        the changes on the css file.
        """
       
        def __init__(self, args):
           
            document = parseString(args)
            request = document.firstChild
           
            address = request.getElementsByTagName('element')[0]
            newdata = request.getElementsByTagName('element')[1]
           
            cssfl = open("/webapps/karinapp/Suite/"+address.getAttribute('value'), 'r')
            cssData = cssfl.read()
            cssfl.close()
           
            dataCSS = ''
            for child in newdata.childNodes:
                if child.nodeType == 3:
                    dataCSS += child.nodeValue
           
            nwcssDict = {}
           
            for piece in dataCSS.split('}'):
                nwcssDict[piece.split('{')[0]] = piece.split('{')[1]
           
           
            cssDict = {}
           
            for piece in cssData.split('}'):
                cssDict[piece.split('{')[0]] = piece.split('{')[1]
           
           
            for key in nwcssDict:
                if key in cssDict == True:
                    del cssDict[key]
               
                cssDict[key] = nwcssDict[key]
           
           
            result = ''
            for key in cssDict:
                result += key+"{"+cssDict[key]+"}"
           
           
            cssfl = open(cssfl.name, 'a')
            cssfl.write(result)
            cssfl.close()
           
           
           
if __name__ == "__main__":
    print(sys.stdin)
   
    savCSS(input)


On Sun, Jan 23, 2011 at 10:16 PM, Hidura <[hidden email]> wrote:
Thanks to all for your fast responses. I will use this on a server
running on Linux, so there is no problem with the OS and probably i
will try to pipes and subprocess, but the pipes worry me because i
can't stop the process using timeout or i don't found how to stop
it...


2011/1/23, Dan Stromberg <[hidden email]>:
> On Sun, Jan 23, 2011 at 4:24 PM, Dave Angel <[hidden email]> wrote:
>> On 01/-10/-28163 02:59 PM, [hidden email] wrote:
>>>
>>> Hello i want to code from different languages using a Python script i
>>> know i can use os.system, but i don't know how to receive data or send
>>> arguments using that method if theres any another way to make it or
>>> there's a way to send arguments and receive data using os.system?
>>>
>>> Thanks in advance.
>>>
>>
>> That sentence runs on, and makes no sense to me.  But I can guess that you
>> would like to be able to write code in other languages, and call it from
>> within a Python script.
>
> Well, clearly it made some sense, or you wouldn't be responding.
>
>> If you're on Windows, and the other language is a compiled one like C,
>> compile it into a DLL, and call that DLL from Python.  Ctypes is the first
>> module to study.
>
> The DLL is but a weak mimicry of what *ix had for a long time before.
> On most *ix's, the .so is the analog to the windows DLL, though only
> AIX appears to suffer from the same kind of "DLL hell" that windows
> suffers from (which makes some historical if not technical sense,
> given that windows is related to OS/2, which like AIX is also from
> IBM).  Using a .so, you can still use ctypes.  You also have the
> option of using Cython, which is perhaps a bit better supported on
> *ix, but will likely now work on windows too.
>
>> If you're on Linux, and the code in the other language was written by
>> someone else, and is already compiled into an executable you cannot
>> change,
>
> This is rare on Linux - almost everything is changeable on Linux,
> because it is almost entirely opensource - sometimes entirely so,
> depending on distribution choice and what 3rd party apps you install
> after the OS install.
>
>> you probably should invoke it using the subprocess module.
>
> This is an option on almost any OS, and in fact is probably a pretty
> good one on almost any OS, even if you do have source.  Sadly, few
> windows programs are written to take advantage of this, perhaps
> because of the historical (dos/windows) command.com's fake pipes.
>
> You can communicate with a subprocess using pipes, or command line
> arguments, or files, or sockets, or shared memory.  There are probably
> other options that aren't coming to mind just now.  But usually, using
> pipes gives the loosest (best) coupling between processes.
>
> Microsoft appears to have recognized this to some extent by releasing
> powershell - though it uses object pipes rather than byte stream
> pipes.  Object pipes appear to require less serialization, but also
> appear to be less loosely coupled.  For remote pipes, powershell
> serializes to XML, while *ix pipes serialize exactly the same way
> remote local or remote.
>

--
Enviado desde mi dispositivo móvil

Diego I. Hidalgo D.



--
Diego I. Hidalgo D.

--
http://mail.python.org/mailman/listinfo/python-list