execute shell script from python, needs sys.argv

M

Matt

Hi All,

I am trying to execute a shell script from within python.. This shell
script takes the format, where $1 and $2 are variables from the
command line: cat $1 | Fastx_trimmer -n COUNT -o $2

straight into the cmd line it would be: cat file.1 | Fastx_trimmer -n
COUNT -o file.2

So, know that there is a way to do this in python using the
subprocess module, but despite a lot of effort, I can't seem to get
this to work, and precisely because of those arguments taken from the
command line.

I was thinking that the easiest thing to so was to

import sys, os, subprocess
proc = subprocess.call([cat sys.argv[1] | fastx_trimmer -n COUNT -o
sys.argv[2]], shell=True)

this clearly does not work...

alternatively, I could put the shell command in its own file, say
fastx.sh, and pass it's arguments to it vie the command line.

import sys, os, subprocess
proc = subprocess.call([fastx.sh, sys.argv[1], sys.argv[2]],
shell=True)

But, this does not seem to work as this is not the proper way to pass
arguments to the shell script.

in short, I'm sure that this is a easy fix, but given my still limited
python vocabulary, it eludes me.

Thanks, Matt
 
B

Benjamin Kaplan

Hi All,

I am trying to execute a shell script from within python..  This shell
script takes the format, where $1 and $2 are variables from the
command line: cat $1 | Fastx_trimmer -n COUNT -o $2

straight into the cmd line it would be:  cat file.1 | Fastx_trimmer -n
COUNT -o file.2

So,  know that there is a way to do this in python using the
subprocess module, but despite a lot of effort, I can't seem to get
this to work, and precisely because of those arguments taken from the
command line.

I was thinking that the easiest thing to so was to

import sys, os, subprocess
proc = subprocess.call([cat sys.argv[1] | fastx_trimmer -n COUNT -o
sys.argv[2]], shell=True)

Python is not the shell. Shell commands are not python commands. You
need either a string or a list of strings, so any literal have to be
in quotes. Also, subprocess can't handle the redirection. You need to
run it as two commands.

proc1 = subprocess.Popen(["cat", sys.argv[1]],stdout =
subprocess.PIPE, shell = True)
proc2 = subprocess.Popen(["fastx_trimmer", "-n", "COUNT", "-o",
sys.argv[2]],stdin=proc1.stdout, shell=True)

this clearly does not work...

alternatively, I could put the shell command in its own file, say
fastx.sh, and pass it's arguments to it vie the command line.

import sys, os, subprocess
proc = subprocess.call([fastx.sh, sys.argv[1], sys.argv[2]],
shell=True)

Again, you need a string. fastx.sh looks for a python object called
fastx and tries accessing an attribute called sh in that object. Ov
course, there's no such thing. Put quotes around it and it will work.
 
P

Peter Otten

Matt said:
I am trying to execute a shell script from within python.. This shell
script takes the format, where $1 and $2 are variables from the
command line: cat $1 | Fastx_trimmer -n COUNT -o $2

straight into the cmd line it would be: cat file.1 | Fastx_trimmer -n
COUNT -o file.2

So, know that there is a way to do this in python using the
subprocess module, but despite a lot of effort, I can't seem to get
this to work, and precisely because of those arguments taken from the
command line.

I was thinking that the easiest thing to so was to

import sys, os, subprocess
proc = subprocess.call([cat sys.argv[1] | fastx_trimmer -n COUNT -o
sys.argv[2]], shell=True)

this clearly does not work...

alternatively, I could put the shell command in its own file, say
fastx.sh, and pass it's arguments to it vie the command line.

import sys, os, subprocess
proc = subprocess.call([fastx.sh, sys.argv[1], sys.argv[2]],
shell=True)

But, this does not seem to work as this is not the proper way to pass
arguments to the shell script.

in short, I'm sure that this is a easy fix, but given my still limited
python vocabulary, it eludes me.

You could do it in two steps:
from subprocess import *
source = Popen(["cat", "/usr/share/dict/words"], stdout=PIPE)
call(["wc"], stdin=source.stdout)
98569 98568 931708
0
A similar example is here, under a "can't miss" headline:

http://docs.python.org/library/subprocess.html#replacing-shell-pipeline

Peter
 
L

Lawrence D'Oliveiro

I KNOW that we're still working on syntax here, and that it's too early
for optimization, but it bothers me to see "cat" as the first thing in a
pipeline.

An anti-UUOC instinct. Very good. :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top