execute shell script from python, needs sys.argv

execute shell script from python, needs sys.argv

Post by Matt » Sat, 06 Nov 2010 00:37:27

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]],

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

execute shell script from python, needs sys.argv

Post by Benjamin K » Sat, 06 Nov 2010 01:06:17

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)

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.


execute shell script from python, needs sys.argv

Post by Peter Otte » Sat, 06 Nov 2010 01:11:06

You could do it in two steps:

98569 98568 931708

A similar example is here, under a "can't miss" headline:

http://www.yqcomputer.com/ #replacing-shell-pipeline


execute shell script from python, needs sys.argv

Post by Tim Robert » Mon, 08 Nov 2010 07:53:48

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. You don't actually need two steps here at all:

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

With this, I don't think you even need "shell=True".
Providenza & Boekelheide, Inc.

execute shell script from python, needs sys.argv

Post by Lawrence D » Mon, 08 Nov 2010 17:48:10

An anti-UUOC instinct. Very good. :)