----------------------------- On Thu, Nov 6, 2014 12:57 AM CET Cameron Simpson wrote:
>On 05Nov2014 14:05, jarod...@libero.it <jarod...@libero.it> wrote: >> I need to use external program from my scirpt. >> code = "intersectBed -a %s -b /database/Refseq_Gene2.bed -wa -wb|cut -f >> 4,8|uniq > tmp.tmp1"%("gene5.tmp.bed") >> code2 = "intersectBed -a %s -b /database/Refseq_Gene2.bed -wa -wb|cut -f >> 4,8|uniq > tmp.tmp2"%("gene3.tmp.bed") >> proc = [] >> p = subprocess.Popen(code,shell=True) >> proc.append(p) >> time.sleep(1) # seconds >> p = subprocess.Popen(code2,shell=True) >> proc.append(p) >> time.sleep(1) >> print >> >sys.stderr,'-------------------------------------------------------------------------' >> print >sys.stderr,"Waiting for Star Fusion Annotate to finish running..." >> for p in proc: >> p.communicate() > >First remark: as written above, your shell pipelines do not read any input and >all their output goes to your temp files. Therefore using p.communicate() is a >waste of time. Just use p.wait(); there is no I/O to do from the point of view >of your Python code. > >Second remark: it is generally a bad idea to use Python's % operator to embed >strings in shell commands (or other "parsed by someone else" text, such as >SQL) because unless you are always very careful about the inserted string (eg >"gene5.tmp.bed") you may insert punctuation, leading to bad behaviour. In your >example code above you are sort of ok, and we can address this as a separate >issue after you have things working. > >> What append I don't habve any error however the file are truncated. > >You need to find out why. > >The shell code _will_ truncate "tmp.tmp1", but then we expect the output of >"uniq" to appear there. > >Start by stripping back the shell pipeline. > >If you remove the "|uniq", is there anything in "tmp.tmp1"? > >If there is not, strip off the "|cut -f 4,8" as well and check again. At that >point we're asking: does intersectBed actually emit any output? > >You can test that on the command line directly, and then build up the shell >pipeline to what you have above by hand. When working, _then_ put it into your >Python program. > >> So I try to use subprocess.call >> >> p = subprocess.call(shlex.split(code),stdout = subprocess.PIPE, stderr = >> subprocess.STDOUT, shell = False) >> but with p.comunicate I have this error: >> >> ('\n***** ERROR: Unrecognized parameter: -wb|cut *****\n***** ERROR: >> Unrecognized parameter: > >[...] > >This is a standard mistake. shlex is _not_ a full shell syntax parser. It is >a simple parser that understands basic shell string syntax (quotes etc) but >NOT redirections. It is really a tool for using with your own minilanguages, >as you might if you were writing an interactive program that accepts user >commands. > >You can't use shlex for shell pipelines or shell redirections. > >What is happening above is that all the "words" are being gathered up and >passed to the "intersectBed" command as arguments; no pipelines! And >"intersectBed" complains bitterly as you show. > >You can see this in the example you post below: > >> shlex.split(code) >> Out[102]: >> ['intersectBed', >> '-a', >> 'gene5.tmp.bed', >> '-b', >> '/home/maurizio/database/Refseq_Gene2.bed', >> '-wa', >> '-wb|cut', >> '-f', >> '4,8|uniq', >> '>', >> 'tmp.tmp1'] >> >> So what can I do? which system do you suggest to my Problem? > >First, forget about shlex. It does not do what you want. > >Then there are three approaches: > >1: Fix up your shell pipeline. You original code should essentially work: >there is just something wrong with your pipeline. Strip it back until you can >see the error. > >2: Construct the pipeline using Popen. This is complicated for someone new to >Popen and subprocess. Essentially you would make each pipeline as 3 distinct >Popen calls, using stdout=PIPE and attached that to the stdin of the next >Popen. Look for "connecting segments" on http://pymotw.com/2/subprocess/ _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor