Calling external program from within python

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Emmanouil Angelakis

    Calling external program from within python

    Hi,

    I am tryiong to do something obviously trivial such as:
    I have a c program called "tsys2list" that when it is ran it asks the user to give the value of "tcal" which is a variable. I want to call the "tsys2list" from within a pyrthon script lets call it "gamma.py" >>>but<<< I want to pass the value of "tcal" to th eprogram automatically and not by interacting with the keyboard.

    How do I do that?

    thanks i advance!
    manolis


  • Mike Driscoll

    #2
    Re: Calling external program from within python

    On Jul 25, 7:56 am, Emmanouil Angelakis <angel...@mpi fr-bonn.mpg.de>
    wrote:
    Hi,
    >
    I am tryiong to do something obviously trivial such as:
    I have a c program called "tsys2list" that when it is ran it asks the user to give the value of "tcal" which is a variable. I want to call the  "tsys2list" from within a pyrthon script lets call it "gamma.py" >>>but<<< I want to pass the value of "tcal" to th eprogram automatically and not by interacting with the keyboard.
    >
    How do I do that?
    >
    thanks i advance!
    manolis
    There are probably many ways to do this. I would recommend checking
    out the subprocess module and see if it does what you want. Or you
    could learn a little Tkinter or wxPython and use that to get the
    user's variable. Or you could even do it via the command line using
    the "raw_input" command.

    Source code: Lib/subprocess.py The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace seve...


    Mike

    Comment

    • Diez B. Roggisch

      #3
      Re: Calling external program from within python

      Mike Driscoll schrieb:
      On Jul 25, 7:56 am, Emmanouil Angelakis <angel...@mpi fr-bonn.mpg.de>
      wrote:
      >Hi,
      >>
      >I am tryiong to do something obviously trivial such as:
      >I have a c program called "tsys2list" that when it is ran it asks the user to give the value of "tcal" which is a variable. I want to call the "tsys2list" from within a pyrthon script lets call it "gamma.py" >>>but<<< I want to pass the value of "tcal" to th eprogram automatically and not by interacting with the keyboard.
      >>
      >How do I do that?
      >>
      >thanks i advance!
      >manolis
      >
      There are probably many ways to do this. I would recommend checking
      out the subprocess module and see if it does what you want.
      This will only work if the program can be fully controlled by
      commandline arguments. If interaction is required, the OP might consider
      using pexpect.

      Or you
      could learn a little Tkinter or wxPython and use that to get the
      user's variable. Or you could even do it via the command line using
      the "raw_input" command.
      I fail to see how *gathering* input (regardless of the method) solves
      the problem of *passing* input to a subprocess.

      Diez

      Comment

      • Grant Edwards

        #4
        Re: Calling external program from within python

        On 2008-07-25, Diez B. Roggisch <deets@nospam.w eb.dewrote:
        >There are probably many ways to do this. I would recommend
        >checking out the subprocess module and see if it does what you
        >want.
        >
        This will only work if the program can be fully controlled by
        commandline arguments.
        Why do you say that? You can interact with programs via
        stdin/stdout using the subprocess module.
        If interaction is required, the OP might consider using
        pexpect.
        Pexpect is a good option, but it's just an automation layer on
        top of the same facilities that subprocess provides.

        --
        Grant Edwards grante Yow! I'm having a BIG BANG
        at THEORY!!
        visi.com

        Comment

        • Diez B. Roggisch

          #5
          Re: Calling external program from within python

          Grant Edwards schrieb:
          On 2008-07-25, Diez B. Roggisch <deets@nospam.w eb.dewrote:
          >
          >>There are probably many ways to do this. I would recommend
          >>checking out the subprocess module and see if it does what you
          >>want.
          >This will only work if the program can be fully controlled by
          >commandline arguments.
          >
          Why do you say that? You can interact with programs via
          stdin/stdout using the subprocess module.

          Because usually if a program *prompts* the user to enter input (and that
          was what I read from the OP's post), one has to deal with pseudo
          terminals, not with stdin/out.
          >If interaction is required, the OP might consider using
          >pexpect.
          >
          Pexpect is a good option, but it's just an automation layer on
          top of the same facilities that subprocess provides.
          AFAIK it's more than that. I'm not an expert on pseudo terminals, but
          AFAIK setting using module pty isn't possible using subprocess.

          Diez

          Comment

          • oj

            #6
            Re: Calling external program from within python

            On Jul 25, 3:44 pm, "Diez B. Roggisch" <de...@nospam.w eb.dewrote:
            Because usually if a program *prompts* the user to enter input (and that
            was what I read from the OP's post), one has to deal with pseudo
            terminals, not with stdin/out.
            How does the program writing some text before taking input change how
            it takes input?

            If it runs in a terminal and takes input from the user via keyboard,
            as in the user types a response and presses enter, it's most likely
            using stdin, in which case subprocess would be perfect.

            Perhaps that OP can clarify how the tcal program takes input?

            Comment

            • Diez B. Roggisch

              #7
              Re: Calling external program from within python

              oj schrieb:
              On Jul 25, 3:44 pm, "Diez B. Roggisch" <de...@nospam.w eb.dewrote:
              >Because usually if a program *prompts* the user to enter input (and that
              >was what I read from the OP's post), one has to deal with pseudo
              >terminals, not with stdin/out.
              >
              How does the program writing some text before taking input change how
              it takes input?
              >
              If it runs in a terminal and takes input from the user via keyboard,
              as in the user types a response and presses enter, it's most likely
              using stdin, in which case subprocess would be perfect.
              Try using SSH with subprocess and prepare to be disappointed when it
              asks for a password.

              See this for a discussion:




              Diez

              Comment

              • Mike Driscoll

                #8
                Re: Calling external program from within python

                On Jul 25, 9:28 am, "Diez B. Roggisch" <de...@nospam.w eb.dewrote:
                Mike Driscoll schrieb:
                >
                On Jul 25, 7:56 am, Emmanouil Angelakis <angel...@mpi fr-bonn.mpg.de>
                wrote:
                Hi,
                >
                I am tryiong to do something obviously trivial such as:
                I have a c program called "tsys2list" that when it is ran it asks the user to give the value of "tcal" which is a variable. I want to call the  "tsys2list" from within a pyrthon script lets call it "gamma.py" >>>but<<< I want to pass the value of "tcal" to th eprogram automatically and not by interacting with the keyboard.
                >
                How do I do that?
                >
                thanks i advance!
                manolis
                >
                There are probably many ways to do this. I would recommend checking
                out the subprocess module and see if it does what you want.
                >
                This will only work if the program can be fully controlled by
                commandline arguments. If interaction is required, the OP might consider
                using pexpect.
                >
                Or you
                could learn a little Tkinter or wxPython and use that to get the
                user's variable. Or you could even do it via the command line using
                the "raw_input" command.
                >
                I fail to see how *gathering* input (regardless of the method) solves
                the problem of *passing* input to a subprocess.
                >
                Diez
                My understanding of the OP's request was that "tsys2list" was a custom
                script of some sort that gathered info from the user, so I wanted to
                know why he didn't just skip calling it and write something in Tkinter
                or wxPython or even via the CLI instead.

                I'm probably just not understanding something.

                Mike

                Comment

                • Diez B. Roggisch

                  #9
                  Re: Calling external program from within python

                  Mike Driscoll schrieb:
                  On Jul 25, 9:28 am, "Diez B. Roggisch" <de...@nospam.w eb.dewrote:
                  >Mike Driscoll schrieb:
                  >>
                  >>On Jul 25, 7:56 am, Emmanouil Angelakis <angel...@mpi fr-bonn.mpg.de>
                  >>wrote:
                  >>>Hi,
                  >>>I am tryiong to do something obviously trivial such as:
                  >>>I have a c program called "tsys2list" that when it is ran it asks the user to give the value of "tcal" which is a variable. I want to call the "tsys2list" from within a pyrthon script lets call it "gamma.py" >>>but<<< I want to pass the value of "tcal" to th eprogram automatically and not by interacting with the keyboard.
                  >>>How do I do that?
                  >>>thanks i advance!
                  >>>manolis
                  >>There are probably many ways to do this. I would recommend checking
                  >>out the subprocess module and see if it does what you want.
                  >This will only work if the program can be fully controlled by
                  >commandline arguments. If interaction is required, the OP might consider
                  >using pexpect.
                  >>
                  >>Or you
                  >>could learn a little Tkinter or wxPython and use that to get the
                  >>user's variable. Or you could even do it via the command line using
                  >>the "raw_input" command.
                  >I fail to see how *gathering* input (regardless of the method) solves
                  >the problem of *passing* input to a subprocess.
                  >>
                  >Diez
                  >
                  My understanding of the OP's request was that "tsys2list" was a custom
                  script of some sort that gathered info from the user, so I wanted to
                  know why he didn't just skip calling it and write something in Tkinter
                  or wxPython or even via the CLI instead.
                  >
                  I'm probably just not understanding something.
                  The program is doing some work, and needs to be told what actually to
                  do. It does so by asking the user, sure. But then it *works*. I think
                  that's pretty clear from

                  """
                  I have a c program called "tsys2list" that when it is ran it asks the
                  user to give the value of "tcal" which is a variable. I want to call the
                  "tsys2list" from within a pyrthon script lets call it "gamma.py"
                  >>>but<<< I want to pass the value of "tcal" to th eprogram
                  automatically and not by interacting with the keyboard.
                  """

                  So replacing it with something that asks the same questions leaves us
                  with the work undone...


                  Diez

                  Comment

                  • Michael Tobis

                    #10
                    Re: Calling external program from within python

                    These answers are too elaborate and abstract for the question.

                    Emmanouil,

                    Here is a program "myprog" which takes input and writes output to a
                    file. It happens to be python but it could be anything.

                    #####
                    #!/usr/bin/env python
                    a = int(raw_input(" enter thing 1 "))
                    b = int(raw_input(" enter thing 2 "))
                    c = raw_input("ente r output file name ")
                    f = open(c,"w")
                    f.write("answer is %s\n" % str(a + b))
                    f.close()
                    #####

                    Here is python code which runs that program

                    #####
                    import os

                    f = os.popen("/path/to/myprog","w")
                    f.write("3\n4\n outputname\n") #can also do three separate writes if
                    that is more convenient
                    f.close()
                    #####

                    For some reason os.popen is deprecated in favor of the more verbose
                    subprocess.Pope n, but this will work for a while.

                    Here is an even simpler approach that will take you a long way. This
                    should be very easy to understand.

                    #####
                    import os

                    params = open("temp","w" )
                    params.write("3 \n")
                    params.write("4 \n")
                    params.write("o utputname2\n")
                    params.close()

                    os.system("/path/to/myprog < temp")
                    #####

                    If you want python to pick up the stdout of your program as well look
                    into popen2.

                    Try basing your solution on those and if you have any problems let us
                    know what they are. In most cases such as you describe these will
                    work.

                    mt

                    Comment

                    • Grant Edwards

                      #11
                      Re: Calling external program from within python

                      On 2008-07-25, Diez B. Roggisch <deets@nospam.w eb.dewrote:
                      Because usually if a program *prompts* the user to enter input (and that
                      was what I read from the OP's post), one has to deal with pseudo
                      terminals, not with stdin/out.
                      >
                      >>If interaction is required, the OP might consider using
                      >>pexpect.
                      >>
                      >Pexpect is a good option, but it's just an automation layer on
                      >top of the same facilities that subprocess provides.
                      >
                      AFAIK it's more than that. I'm not an expert on pseudo terminals, but
                      AFAIK setting using module pty isn't possible using subprocess.
                      You're right. I forgot that pexect uses a pty. You could use
                      a pty with the subprocess module, but it's a hassle to set up.

                      --
                      Grant Edwards grante Yow! The PINK SOCKS were
                      at ORIGINALLY from 1952!!
                      visi.com But they went to MARS
                      around 1953!!

                      Comment

                      • Terry Reedy

                        #12
                        Re: Calling external program from within python



                        Michael Tobis wrote:
                        For some reason os.popen is deprecated in favor of the more verbose
                        subprocess.Pope n, but this will work for a while.
                        As explained in
                        This PEP describes a new module for starting and communicating with processes.

                        subprocess consolidated replaced several modules and functions (popen*,
                        system, spawn*, ???)with better security, exception handling, and
                        flexibility. The deprecated modules are gone in 3.0, so the OP might
                        want to start with subprocess now.

                        Comment

                        Working...