Thread

  1. BUG #14583: plpythonu : subprocess not working in function

    paulo.nuno.leite@gmail.com — 2017-03-08T17:51:19Z

    The following bug has been logged on the website:
    
    Bug reference:      14583
    Logged by:          Paulo B
    Email address:      paulo.nuno.leite@gmail.com
    PostgreSQL version: 9.5.6
    Operating system:   Windows
    Description:        
    
    I have the following function that runs a command:
    
    
    CREATE OR REPLACE FUNCTION public.classify_test()
      RETURNS void AS
    $BODY$
    import os
    from subprocess import Popen, PIPE
    import subprocess
    import os
    from subprocess import Popen, PIPE
    
    echo=Popen(('echo', '123'), shell=True)
    
    p = subprocess.Popen(['python.exe', '-u','test.py'], stdin = echo.stdout,
    universal_newlines = True, shell = True)
    	
    $BODY$
      LANGUAGE plpythonu VOLATILE
      COST 100;
    ALTER FUNCTION public.classify_test()
      OWNER TO postgres;
    
    if I run this fuction as select classify_test() it will not run the python
    script. However, if I run it in the command line it will work. It works as
    well in SublimeText2 IDE. I have been trying to find what the bug or problem
    is, but had no success. I am using python2.7, I have psycopg2 installed. 
    
    Why doesn't  postgresql  execute the python script?
    
    
    
    
    
    
  2. Re: BUG #14583: plpythonu : subprocess not working in function

    Kieran McCusker <kieran.mccusker@gmail.com> — 2017-03-09T18:14:49Z

    On 8 March 2017 at 17:51, <paulo.nuno.leite@gmail.com> wrote:
    
    > The following bug has been logged on the website:
    >
    > Bug reference:      14583
    > Logged by:          Paulo B
    > Email address:      paulo.nuno.leite@gmail.com
    > PostgreSQL version: 9.5.6
    > Operating system:   Windows
    > Description:
    >
    > I have the following function that runs a command:
    >
    >
    > CREATE OR REPLACE FUNCTION public.classify_test()
    >   RETURNS void AS
    > $BODY$
    > import os
    > from subprocess import Popen, PIPE
    > import subprocess
    > import os
    > from subprocess import Popen, PIPE
    >
    > echo=Popen(('echo', '123'), shell=True)
    >
    > p = subprocess.Popen(['python.exe', '-u','test.py'], stdin = echo.stdout,
    > universal_newlines = True, shell = True)
    >
    > $BODY$
    >   LANGUAGE plpythonu VOLATILE
    >   COST 100;
    > ALTER FUNCTION public.classify_test()
    >   OWNER TO postgres;
    >
    > if I run this fuction as select classify_test() it will not run the python
    > script. However, if I run it in the command line it will work. It works as
    > well in SublimeText2 IDE. I have been trying to find what the bug or
    > problem
    > is, but had no success. I am using python2.7, I have psycopg2 installed.
    >
    > Why doesn't  postgresql  execute the python script?
    >
    >
    >
    >
    >
    > --
    > Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
    > To make changes to your subscription:
    > http://www.postgresql.org/mailpref/pgsql-bugs
    
    
    Hi
    
    I had the same problem migrating to python3. My python3 code now looks like
    
    $BODY$
      import subprocess
    
      plpy.execute('drop server if exists fi_server_{} cascade'.format(id))
    
      try:
        subprocess.check_output(['/usr/local/bin/ogr_fdw_info',
          '-s', 'fi_server_{}'.format(id),
          '-t', 'import.t{0}_{1}'.format(id, worksheet),
          '-d', filename,
          '-w', str(worksheet)
        ])
    
      except subprocess.CalledProcessError, e:
        if e.returncode == 1:
          plpy.execute(e.output)
          return None
        else:
          return e.output
    
    Hope this helps
    
    Kieran