Seite 1 von 1

Subprocess Skript

Verfasst: Montag 28. September 2015, 09:22
von Flo89
Hallo Leute,

ich habe folgendes Problem:

Ich möchte erreichen, das Folgendes in der Konsole eingelesen bzw. ausgegeben wird.

./bwa index -a 'is' /path/to/folder/datei.fa

Bisher schaffe ich es noch nicht die Datei direkt an den Pfad zu hängen. Habt ihr eine Idee wie man das mit Python schafft ?

Das hier ist meine Fehlermeldung:

./bwa index -a 'is': /mnt/vault/tmp/until_2016_01_01/florian/OpenSourceTools/BWA/bwa-0.7.12: is a directory


Hier ist mein Code:

Code: Alles auswählen


#!/usr/bin/python

import os, sys
import subprocess

def open_source_tools():

	
	# copy the trimmed sequences filenames into a list
	counter = 0
	trim_seq = []
	for x in os.listdir("/mnt/vault/tmp/until_2016_01_01/florian/trimmed_seq_salmonella_normal_20percentage"):
    		trim_seq.append(x)		

	# paths to the folders
	open_bwa_index = "/mnt/vault/tmp/until_2016_01_01/florian/OpenSourceTools/BWA/bwa-0.7.12"
	open_bwa_mem = "/mnt/vault/tmp/until_2016_01_01/florian/OpenSourceTools/BWA/bwa-0.7.12"
	open_trimmed_reads = "/mnt/vault/tmp/until_2016_01_01/florian/trimmed_seq_salmonella_normal_20percentage"
	open_reference_genome = "/mnt/vault/tmp/until_2016_01_01/florian/OpenSourceTools/BWA/bwa-0.7.12/reference_genomes"
	
	best_match_liste = ['NC_016856_genome.fa','NC_022569_genome.fa','NC_022569_genome.fa','NC_016856_genome.fa','NC_022569_genome.fa''NC_016860_genome.fa',		
			     'NC_016860_genome.fa','NC_016860_genome.fa','NC_016860_genome.fa','NC_016856_genome.fa','NC_016860_genome.fa','NC_016860_genome.fa',
			     'NC_022569_genome.fa','NC_016860_genome.fa','NC_022569_genome.fa','NC_022569_genome.fa','NC_017046_genome.fa','NC_022569_genome.fa',
			     'NC_016856_genome.fa','NC_016856_genome.fa','NC_016856_genome.fa','NC_016856_genome.fa','NC_022569_genome.fa','NC_017046_genome.fa',
			     'NC_016856_genome.fa','NC_022569_genome.fa','NC_016856_genome.fa','NC_016856_genome.fa','NC_016856_genome.fa','NC_016856_genome.fa',
			     'NC_016856_genome.fa','NC_021814_genome.fa','NC_021814_genome.fa','NC_016860_genome.fa','NC_011294_genome.fa','NC_011294_genome.fa',
			     'NC_011294_genome.fa','NC_011294_genome.fa','NC_011294_genome.fa','NC_011294_genome.fa','NC_011294_genome.fa','NC_011294_genome.fa',
			     'NC_016856_genome.fa','NC_011294_genome.fa','NC_016856_genome.fa','NC_022991_genome.fa','NC_021814_genome.fa']		
	
	# run bwa index to construct FM index
	for ref in best_match_liste:
		bwa_index_command = subprocess.call([open_bwa_index, "./bwa index -a 'is'",open_reference_genome,ref],shell=True)
			
	# run bwa mem to map the reads to the reference	
	for trim in open_trimmed_reads:
		bwa_mem_command = subprocess.call([open_bwa_index, "./bwa mem -t 1 -P", open_reference_genome,ref, open_trimmed_reads, trim],shell=True)


	
	#open Bacterial Analysis Pipeline
	#print(trim_seq)
	subprocess.call(["firefox", "-new-tab","https://cge.cbs.dtu.dk/services/CGEpipeline-1.1/"])



open_source_tools()


Re: Subprocess Skript

Verfasst: Montag 28. September 2015, 09:46
von sparrow
Wenn ich dein Problem richtig verstehe, funktioniert folgendes:

Code: Alles auswählen

>>> import os
>>> filename = "textdatei.txt"
>>> pathname = r"c:\test\storage"
>>> os.path.join(pathname, filename)
'c:\test\\storage\\textdatei.txt'

Re: Subprocess Skript

Verfasst: Montag 28. September 2015, 10:40
von cofi
Die Aufrufe in Zeile 33 und 37 sind falsch. Entweder du uebergibst einen kompletten String und laesst ihn durch eine Shell interpretieren oder eine Liste und uebergibst Argumente einzeln. Da hier keine Shell noetig ist:

Code: Alles auswählen

bwa_index_command = subprocess.call([open_bwa_index, "./bwa", "index", "-a", "is", open_reference_genome, ref])

Re: Subprocess Skript

Verfasst: Montag 28. September 2015, 12:08
von Sirius3
@Flo89: Du willst wahrscheinlich folgendes schreiben:

Code: Alles auswählen

bwa_index_command = subprocess.call([os.path.join(open_bwa_index, "bwa"), "index", "-a", "is", open_reference_genome, ref])
bzw.

Code: Alles auswählen

bwa_mem_command = subprocess.call([os.path.join(open_bwa_mem, "bwa"), "mem", "-t", "1", "-P", open_reference_genome, ref, open_trimmed_reads, trim])

Re: Subprocess Skript

Verfasst: Montag 28. September 2015, 12:27
von BlackJack
@Flo89: Noch ein paar Anmerkungen:

`sys` wird importiert aber nicht verwendet.

Die Variablen `counter`, `open_bwa_mem`, `bwa_index_command`, und `bwa_mem_command` werden ebenfalls nicht verwendet. Die letzten beiden Namen sind ”falsch”, da es sich um einen numerischen Rückgabecode von der Programmausführung handelt und nichts was ein `command` repräsentieren würde.

`trim_seq` wird umständlich erstellt. `os.listdir()` liefert bereits eine Liste und Du nimmst dann jedes Element und steckst es in eine neue Liste. Da kann man auch gleich die Liste verwenden die `os.listdir()` liefert.

Dann wird `trim_seq` aber nirgends verwendet. Dafür iterierst Du später über die einzelnen Zeichen des Pfadnamens dessen Dateien in `trim_seq` stehen, was mal sehr falsch aussieht. Kann es sein dass Du an der Stelle eigentlich über die Dateinamen iterieren wolltest‽ Man sollte Namen auch nicht so weit vor der Stelle binden bevor sie dann tatsächlich benutzt werden. Da muss man dann immer im Quelltext suchen wo etwas benutzt wird beziehungsweise wenn man an der Stelle ist wo es benutzt wird, sucht man sich dann einen Wolf wo und wie das überhaupt definiert wurde. Und wenn man die Stelle(n) entfernt wo etwas benutzt wird, übersieht man gerne mal die Definition davon wenn die woanders steht und dann hat man so Sachen wie `counter` was irgendwo ganz am Anfang mal auf 0 gesetzt wird, aber nirgends mehr verwendet wird.

Bei den Pfaden gibt es eine Menge an Wiederholungen in den Namen, das würde man besser herausziehen.

Ich komme dann auf so etwas (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function

import os
import subprocess


def open_source_tools():
    base_path = '/mnt/vault/tmp/until_2016_01_01/florian'

    # paths to the folders
    open_bwa_path = os.path.join(base_path, 'OpenSourceTools/BWA/bwa-0.7.12')
    open_bwa_binary = os.path.join(open_bwa_path, 'bwa')
    open_reference_genome_path = os.path.join(
        open_bwa_path, 'reference_genomes'
    )

    trimmed_reads_path = os.path.join(
        base_path, 'trimmed_seq_salmonella_normal_20percentage'
    )

    best_matches = [
        'NC_016856_genome.fa', 'NC_022569_genome.fa', 'NC_022569_genome.fa',
        'NC_016856_genome.fa', 'NC_022569_genome.fa', 'NC_016860_genome.fa',
        'NC_016860_genome.fa', 'NC_016860_genome.fa', 'NC_016860_genome.fa',
        'NC_016856_genome.fa', 'NC_016860_genome.fa', 'NC_016860_genome.fa',
        'NC_022569_genome.fa', 'NC_016860_genome.fa', 'NC_022569_genome.fa',
        'NC_022569_genome.fa', 'NC_017046_genome.fa', 'NC_022569_genome.fa',
        'NC_016856_genome.fa', 'NC_016856_genome.fa', 'NC_016856_genome.fa',
        'NC_016856_genome.fa', 'NC_022569_genome.fa', 'NC_017046_genome.fa',
        'NC_016856_genome.fa', 'NC_022569_genome.fa', 'NC_016856_genome.fa',
        'NC_016856_genome.fa', 'NC_016856_genome.fa', 'NC_016856_genome.fa',
        'NC_016856_genome.fa', 'NC_021814_genome.fa', 'NC_021814_genome.fa',
        'NC_016860_genome.fa', 'NC_011294_genome.fa', 'NC_011294_genome.fa',
        'NC_011294_genome.fa', 'NC_011294_genome.fa', 'NC_011294_genome.fa',
        'NC_011294_genome.fa', 'NC_011294_genome.fa', 'NC_011294_genome.fa',
        'NC_016856_genome.fa', 'NC_011294_genome.fa', 'NC_016856_genome.fa',
        'NC_022991_genome.fa', 'NC_021814_genome.fa'
    ]

    # run bwa index to construct FM index
    for ref in best_matches:
        subprocess.call(
            [
                open_bwa_binary,
                'index',
                '-a', 'is',
                open_reference_genome_path,
                ref
            ]
        )

    # run bwa mem to map the reads to the reference
    for trim in os.listdir(trimmed_reads_path):
        subprocess.call(
            [
                open_bwa_binary,
                'mem',
                '-t', '1',
                '-P', open_reference_genome_path,
                ref,
                os.path.join(trimmed_reads_path, trim)
            ]
        )

    # open Bacterial Analysis Pipeline
    subprocess.call(
        [
            'firefox',
            '-new-tab',
            'https://cge.cbs.dtu.dk/services/CGEpipeline-1.1/'
        ]
    )


open_source_tools()