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. </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: "Courier New";" =
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""> 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""> =
environ['ORACLE_SID'] =3D 'orcl'</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> x =3D =
TestClass()</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> x.exec_shell()</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> =
x.exec_query()</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> 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""> =
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: "Courier New";" 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: "Courier New";" =
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""> def =
__init__(self):</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> 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""> def exec_shell(self):</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""> =
print 'TestClass::exec_shell()'</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> rc =3D =
call('/tmp/orcl-callback.sh')</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> print =
'TestClass::exec_shell() -> 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""> def =
exec_query(self):</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> conn =3D =
None</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> cur =3D =
None</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> print =
'TestClass::exec_query(). Running seelect hello from =
dual'</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> =
try:</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> conn =
=3D cx_Oracle.connect(mode=3Dcx_Oracle.SYSDBA)</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""> =
cur =3D =
conn.cursor()</font></div><div class=3D""><font face=3D"Courier New" =
class=3D""> =
cur.execute("select 'hello' from dual")</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> =
for v in cur:</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> =
print v</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""> =
except cx_Oracle.Error as e1:</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""> =
raise e1</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""> =
finally:</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> =
if cur:</font></div><div class=3D""><font =
face=3D"Courier New" class=3D""> =
cur.close()</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""> =
if conn:</font></div><div =
class=3D""><font face=3D"Courier New" class=3D""> =
=
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 " This is a echo from shell =
script"</font></div><div class=3D""><font face=3D"Courier New" =
class=3D"">echo " 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==--