Bad_Coder
Bad_Coder

Reputation: 1019

subprocess module in python

I have to connect to a sybase database and run a simple select query using python script

On my server isql command can run only from sybase bin directory, so i have to cd to that directory before firing the query.

---------------------------Edited-----------------------------

Uptill now i'm able to do this:-

#!/usr/bin/python
  import subprocess
  path = "path/to/sybase/bin"
  os.chdir(path)
  arguments = ['./isql',"-S server_name", "-U user", "-P password", "-D database","""<<EOF
  SELECT * FROM sometable
  go
  EOF"""]
  ps = subprocess.Popen(arguments)
  out = ps.communicate()
  print out

The errors are just out of my understanding capability :(

Traceback (most recent call last):
File "./test_db.py", line 8, in ?
ps = subprocess.Popen(arguments)
File "/usr/lib64/python2.4/subprocess.py", line 542, in __init__
errread, errwrite)
File "/usr/lib64/python2.4/subprocess.py", line 975, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory

I'm able to do this outside my python script using isql command on my unix terminal

how can i use isql in python subprocess module?

Upvotes: 0

Views: 792

Answers (4)

Bad_Coder
Bad_Coder

Reputation: 1019

i know it's been long but just wanted to close this question

from subprocess import Popen, PIPE
from textwrap import dedent

isql = Popen(['./isql', '-I', '/app/sybase/...',
              '-S', mdbserver,
              '-U', muserid,
              '-P', password, ...,
              '-w', '99999'], stdin=PIPE, stdout=PIPE, cwd=sybase_path)
output = isql.communicate(dedent("""\
    SET NOCOUNT ON
    {}
    go
""".format(User_Query)))[0]

Upvotes: 0

confused_at_times
confused_at_times

Reputation: 545

Try:

import os
import subprocess

os.chdir('/path/to/sybase/bin')

if os.path.exists('isql') or os.path.exists(os.path.join('/path/to/sybase/bin', 'isql')):
    ps = subprocess.Popen('isql -S %s -U %s -P %s -D %s <<EOF SELECT * FROM sometable EOF' % (server,user,passwd,database), stdout=subprocess.PIPE, shell=True)
    out, err = ps.communicate()
else:
    print "isql does not exists in this folder"

I am not super experienced with subprocess but this is how I generally use it on the odd occasion. Hopefully someone else can give a better answer/explanation.

Edit: removed the square brackets to remove confusion.

Upvotes: 0

marcelocra
marcelocra

Reputation: 2473

There is a particular Popen argument for that: cwd, as mentioned here. Provide your command using an array and then the cwd parameter with where the command must be executed:

subprocess.Popen(['ls', '-l'], cwd="/path/to/folder")

Upvotes: 1

otus
otus

Reputation: 5732

Popen only takes one args argument, for the command to run. You could try calling a shell with both the cd and isql commands as arguments, but changing the working directory from python is probably simpler

For the former approach:

subprocess.Popen('/bin/sh -c "cd /path/to/... && isql -arg1..'...)

for the latter:

os.chdir('/path/to...')
subprocess.Popen('isql -arg1..'...)

Upvotes: 0

Related Questions