Python Forum
OS command via python subprocess module - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: OS command via python subprocess module (/thread-13549.html)

Pages: 1 2 3


OS command via python subprocess module - alinaveed786 - Oct-20-2018

Can we use below OS commands (inside the file.txt) and then pass this file an argument to the subprocess.popen for execution?
OR is there a better way to execute all below OS commands inside python script?





export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH 
cd $ORACLE_HOME 
mv OPatch OPatch.pre6880880 
mkdir OPatch 

 
osTyp=`uname -s` 
if [ "$osTyp" = "Linux" ]; 
then 
cp /gfd/infr/DBA/oracle12102-Linux-X86-64/6880880_zipDir/p6880880_122010_Linux-x86-64.zip . 
unzip p6880880_122010_Linux-x86-64.zip 
elif [ "$osTyp" = "SunOS" ]; 
then 
cp /gfd/infr/DBA/oracle12102-Solaris64/6880880_zipDir/p6880880_122010_SOLARIS64.zip . 
unzip p6880880_122010_SOLARIS64.zip 
else 
echo "!!" echo "!! unable to determine OS type" echo "!!" 
fi



RE: OS command via python subprocess module - Gribouillis - Oct-20-2018

I recently came across a nice way to convert such scripts: the plumbum module. Using this module, your python code could more or less resemble the following
from plumbum import local, cmd
ORACLE_HOME = local.env['ORACLE_HOME']
local.env['PATH'] = "{ohome}/bin:{ohome}/OPatch:{path}".format(
    ohome=ORACLE_HOME, path=local.env[PATH])
local.cwd.chdir(ORACLE_HOME)
cmd.mv('OPatch', 'OPatch.pre6880880')
cmd.mkdir('OPatch')

osTyp = cmd.uname('-s').strip()
if osTyp == 'Linux':
    cmd.cp(
        "/gfd/infr/DBA/oracle12102-Linux-X86-64/6880880_zipDir/p6880880_122010_Linux-x86-64.zip", ".")
    cmd.unzip("p6880880_122010_Linux-x86-64.zip")
elif osTyp == 'SunOs':
    cmd.cp("/gfd/infr/DBA/oracle12102-Solaris64/6880880_zipDir/p6880880_122010_SOLARIS64.zip", ".") 
    cmd.unzip("p6880880_122010_SOLARIS64.zip") 
else
    print("!!\n!! unable to determine OS type !!\n!!")



RE: OS command via python subprocess module - alinaveed786 - Oct-20-2018

Thanks. Will look into the plumbum module. Anyways any idea why I m not able to get cd via subprocess.run

subprocess.run('echo $ORACLE_HOME', shell=True)
subprocess.run('cd "$ORACLE_HOME"', shell=True)
subprocess.run('pwd', shell=True)
output:
/u01/app/oracle/product/12.1.0.2/db_1
/u02/scripts/Patching



RE: OS command via python subprocess module - Gribouillis - Oct-20-2018

(Oct-20-2018, 09:53 AM)alinaveed786 Wrote: any idea why I m not able to get cd via subprocess.run
It is because subprocess.run('cd $ORACLE_HOME', shell=True) starts a new shell process and changes directory in this spawned process. It doesn't change the current directory of the calling process. For this you need to call os.chdir()


RE: OS command via python subprocess module - alinaveed786 - Oct-20-2018

Not working either with os.chdir.

#!/usr/bin/python
import os
import subprocess


subprocess.run('echo $ORACLE_HOME', shell=True)

os.chdir("'$ORACLE_HOME'")

subprocess.run('pwd', shell=True)
Error
/u01/app/oracle/product/12.1.0.2/db_1
Traceback (most recent call last):
  File "/u02/scripts/Patching/Ping.py", line 9, in <module>
    os.chdir("'$ORACLE_HOME'")
FileNotFoundError: [Errno 2] No such file or directory: "'$ORACLE_HOME'"



RE: OS command via python subprocess module - Gribouillis - Oct-20-2018

Try os.chdir(os.environ['ORACLE_HOME'])


RE: OS command via python subprocess module - alinaveed786 - Oct-20-2018

thanks, it worked. Moreover, I installed the plumbum module and executed the code but got below error
Traceback (most recent call last):
  File "/u02/scripts/Patching/Test.py", line 8, in <module>
    local.env['PATH'] = "{ohome}/bin:{ohome}/OPatch:{path}".format(ohome=ORACLE_HOME, path=local.env[PATH])
NameError: name 'PATH' is not defined



RE: OS command via python subprocess module - volcano63 - Oct-20-2018

(Oct-20-2018, 10:22 AM)alinaveed786 Wrote: thanks, it worked. Moreover, I installed the plumbum module and executed the code but got below error
Traceback (most recent call last):
  File "/u02/scripts/Patching/Test.py", line 8, in <module>
    local.env['PATH'] = "{ohome}/bin:{ohome}/OPatch:{path}".format(ohome=ORACLE_HOME, path=local.env[PATH])
NameError: name 'PATH' is not defined

The source of you exception (posting code with lines broken to fit screen may be a good idea)
path=local.env[PATH]


RE: OS command via python subprocess module - alinaveed786 - Oct-20-2018

Thanks, it worked. Additionally, I want to add below statement to the code but its throwing error. Basically, want to remove directory "OPatch.pre6880880" but it's not an empty directory

#!/usr/bin/python

from plumbum import local, cmd

ORACLE_HOME = local.env['ORACLE_HOME']
path=local.env['PATH']
local.env['PATH'] = "{ohome}/bin:{ohome}/OPatch:{path}".format(ohome=ORACLE_HOME, path=local.env['PATH'])
local.cwd.chdir(ORACLE_HOME)
cmd.rm -rf('OPatch.pre6880880')
cmd.mv('OPatch', 'OPatch.pre6880880')
cmd.mkdir('OPatch')
osTyp = cmd.uname('-s').strip()

if osTyp == 'Linux':
    cmd.cp("/u03/p6880880_121010_Linux-x86-64.zip", ".")
    cmd.unzip("p6880880_121010_Linux-x86-64.zip")
elif osTyp == 'SunOs':
    cmd.cp("/u03/p6880880_121010_Linux-x86-64.zip", ".")
    cmd.unzip("p6880880_121010_Linux-x86-64.zip")
else:
    print("!!\n!! unable to determine OS type !!\n!!")
Error
    cmd.rm -rf('OPatch.pre6880880')
NameError: name 'rf' is not defined



RE: OS command via python subprocess module - Gribouillis - Oct-20-2018

This is python, not bash. Use cmd.rm('-rf', 'OPatch.pre6880880' )