wrong subprocess.call() return after use cx_Oracle

Anderson Carlos Trindade <[email protected]> Thu, 28 May 2020 23:19:28 -0300
Newsgroups gmane.comp.python.db.cx-oracle
Message-ID <[email protected]>
--===============4818396592799786045==
Content-Type: multipart/alternative;
	boundary="Apple-Mail=_D5017245-EEDD-4297-93C1-9A50CB5B1BEC"


--Apple-Mail=_D5017245-EEDD-4297-93C1-9A50CB5B1BEC
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Hi list,

I=E2=80=99m facing a strength behaviour on a Python project (the first =
one I=E2=80=99m using cx_Oracle). Scenario:

This python application must access database and get some simple data =
(query returning two columns and no more than 4 or 5 rows).

After run this query, I must call invoke a shell script from my Python =
code and I must check the retcode, returned by the shell.

The problem is that subprocess.call() always return 0 (zero) as retcode =
from shell (even when shell explicitly exit with any other retcode), and =
this is happening only If a use cx_Oracle.

My environment:

	Oracle Linux 7.7
	Python 2.7.5
	Oracle 11.2.0.4

I could reproduce this problem with a simple test case that I=E2=80=99m =
sending below.=20
Please my apologies by any english mistakes.


testenv.py file

# -*- coding: latin-1 -*-
'''
Created on 28 de mai de 2020
'''

from os import environ
from execshell import TestClass

def entrypoint():

    environ['ORACLE_HOME'] =3D =
'/u01/app/oracle/product/11.2.0.4/dbhome_ee'
    environ['ORACLE_SID'] =3D 'orcl'
    x =3D TestClass()
    x.exec_shell()
    x.exec_query()
    x.exec_shell()

if __name__=3D=3D'__main__':
    entrypoint()


execshell.py file

# -*- coding: latin-1 -*-
'''
Created on 28 de mai de 2020
=E2=80=98''

import cx_Oracle
from subprocess import call

class TestClass(object):

    def __init__(self):
        self.rman_configs =3D None

    def exec_shell(self):
        print 'TestClass::exec_shell()'
        rc =3D call('/tmp/orcl-callback.sh')
        print 'TestClass::exec_shell() -> os.call returned code {} from =
shell'.format(rc)

    def exec_query(self):
            conn =3D None
            cur =3D None
            print 'TestClass::exec_query(). Running seelect hello from =
dual'
            try:
                conn =3D cx_Oracle.connect(mode=3Dcx_Oracle.SYSDBA)
                cur =3D conn.cursor()
                cur.execute("select 'hello' from dual")
                for v in cur:
                    print v
            except cx_Oracle.Error as e1:
                raise e1
            finally:
                if cur:
                    cur.close()
                if conn:
                    conn.close()


the called shell script (oral-callback.sh):

#!/bin/bash

echo "   This is a echo from shell script"
echo "   The shell will simulate an error, returning non zero code"
sleep 2
exit 125




--Apple-Mail=_D5017245-EEDD-4297-93C1-9A50CB5B1BEC
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; =
charset=3Dutf-8"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; line-break: after-white-space;" class=3D"">Hi =
list,<div class=3D""><br class=3D""></div><div class=3D"">I=E2=80=99m =
facing a strength behaviour on a Python project (the first one I=E2=80=99m=
 using cx_Oracle). Scenario:</div><div class=3D""><br =
class=3D""></div><div class=3D"">This python application must access =
database and get some simple data (query returning two columns and no =
more than 4 or 5 rows).</div><div class=3D""><br class=3D""></div><div =
class=3D"">After run this query, I must call invoke a shell script from =
my Python code and I must check the retcode, returned by the =
shell.</div><div class=3D""><br class=3D""></div><div class=3D"">The =
problem is that subprocess.call() always return 0 (zero) as retcode from =
shell (even when shell explicitly exit with any other retcode), and this =
is happening only If a use cx_Oracle.</div><div class=3D""><br =
class=3D""></div><div class=3D"">My environment:</div><div class=3D""><br =
class=3D""></div><div class=3D""><span class=3D"Apple-tab-span" =
style=3D"white-space:pre">	</span>Oracle Linux 7.7</div><div =
class=3D""><span class=3D"Apple-tab-span" style=3D"white-space:pre">	=
</span>Python 2.7.5</div><div class=3D""><span class=3D"Apple-tab-span" =
style=3D"white-space:pre">	</span>Oracle 11.2.0.4</div><div =
class=3D""><br class=3D""></div><div class=3D"">I could reproduce this =
problem with a simple test case that I=E2=80=99m sending =
below.&nbsp;</div><div class=3D"">Please my apologies by any english =
mistakes.</div><div class=3D""><br class=3D""></div><div class=3D""><font =
face=3D"Courier New" class=3D""><br class=3D""></font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">testenv.py =
file</font></div><div class=3D""><font face=3D"Courier New" class=3D""><br=
 class=3D""></font></div><div class=3D""><div class=3D""><font =
face=3D"Courier New" class=3D""># -*- coding: latin-1 =
-*-</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">'''</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">Created on 28 de mai de 2020</font></div><div class=3D""><span =
style=3D"font-family: &quot;Courier New&quot;;" =
class=3D"">'''</span></div><div class=3D""><font face=3D"Courier New" =
class=3D""><br class=3D""></font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">from os import environ</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">from execshell import =
TestClass</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""><br class=3D""></font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">def entrypoint():</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""><br =
class=3D""></font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; environ['ORACLE_HOME'] =3D =
'/u01/app/oracle/product/11.2.0.4/dbhome_ee'</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; =
environ['ORACLE_SID'] =3D 'orcl'</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; x =3D =
TestClass()</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; x.exec_shell()</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; =
x.exec_query()</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; x.exec_shell()</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""><br class=3D""></font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">if =
__name__=3D=3D'__main__':</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; =
entrypoint()</font></div></div><div class=3D""><font face=3D"Courier =
New" class=3D""><br class=3D""></font></div><div class=3D""><font =
face=3D"Courier New" class=3D""><br class=3D""></font></div><div =
class=3D""><span style=3D"caret-color: rgb(0, 0, 0); color: rgb(0, 0, =
0); font-family: &quot;Courier New&quot;;" class=3D"">execshell.py =
file</span></div><div class=3D""><span style=3D"caret-color: rgb(0, 0, =
0); color: rgb(0, 0, 0); font-family: &quot;Courier New&quot;;" =
class=3D""><br class=3D""></span></div><div class=3D""><div =
class=3D""><font face=3D"Courier New" class=3D""># -*- coding: latin-1 =
-*-</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">'''</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">Created on 28 de mai de 2020</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">=E2=80=98''</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""><br =
class=3D""></font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">import cx_Oracle</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">from subprocess import =
call</font></div><div class=3D""><font face=3D"Courier New" class=3D""><br=
 class=3D""></font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">class TestClass(object):</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""><br class=3D""></font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; def =
__init__(self):</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; self.rman_configs =3D =
None</font></div><div class=3D""><font face=3D"Courier New" class=3D""><br=
 class=3D""></font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; def exec_shell(self):</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp; print 'TestClass::exec_shell()'</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; rc =3D =
call('/tmp/orcl-callback.sh')</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; print =
'TestClass::exec_shell() -&gt; os.call returned code {} from =
shell'.format(rc)</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""><br class=3D""></font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; def =
exec_query(self):</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; conn =3D =
None</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur =3D =
None</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print =
'TestClass::exec_query(). Running seelect hello from =
dual'</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
try:</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; conn =
=3D cx_Oracle.connect(mode=3Dcx_Oracle.SYSDBA)</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur =3D =
conn.cursor()</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
cur.execute("select 'hello' from dual")</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; for v in cur:</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print v</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; except cx_Oracle.Error as e1:</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise e1</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; finally:</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; if cur:</font></div><div class=3D""><font =
face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur.close()</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if conn:</font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
conn.close()</font></div></div><div class=3D""><font face=3D"Courier =
New" class=3D""><br class=3D""></font></div><div class=3D""><font =
face=3D"Courier New" class=3D""><br class=3D""></font></div><div =
class=3D""><font face=3D"Courier New" class=3D"">the called shell script =
(oral-callback.sh):</font></div><div class=3D""><font face=3D"Courier =
New" class=3D""><br class=3D""></font></div><div class=3D""><div =
class=3D""><font face=3D"Courier New" =
class=3D"">#!/bin/bash</font></div><div class=3D""><br =
class=3D""></div><div class=3D""><font face=3D"Courier New" =
class=3D"">echo " &nbsp; This is a echo from shell =
script"</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">echo " &nbsp; The shell will simulate an error, returning non =
zero code"</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">sleep 2</font></div><div class=3D""><font face=3D"Courier =
New" class=3D"">exit 125</font></div></div><div class=3D""><br =
class=3D""></div><div class=3D""><br class=3D""></div><div class=3D""><br =
class=3D""></div></body></html>=

--Apple-Mail=_D5017245-EEDD-4297-93C1-9A50CB5B1BEC--


--===============4818396592799786045==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============4818396592799786045==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
cx-oracle-users mailing list
cx-oracle-users-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/cx-oracle-users

--===============4818396592799786045==--