Subprocess Skript

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Flo89
User
Beiträge: 9
Registriert: Donnerstag 3. September 2015, 19:51

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()

Benutzeravatar
sparrow
User
Beiträge: 4548
Registriert: Freitag 17. April 2009, 10:28

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'
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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])
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@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])
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()
Antworten