2015-06-05 13 views

risposta

6

Ho avuto a similar problem before, ma utilizzando optparse anziché argparse.

Non è necessario cambiare nulla nella sceneggiatura originale, basta assegnare un nuovo elenco per sys.argv in questo modo:

if __name__ == "__main__": 
    from Bio import SeqIO 
    path = '/path/to/sequences.txt' 
    sequences = [str(record.seq) for record in SeqIO.parse(path, 'fasta')] 
    sys.argv = ['-f'] + sequences 
    main() 
+2

Bello. Basta aggiungere dummy 'sys.argv' funziona come' sys.argv = ['foo'] '. – jef

1

Ho finito per utilizzare BioPython per estrarre le sequenze e quindi modificare l'implementazione di Ilya Steanov per rimuovere i metodi argparse.

import imp 
seqs = [] 
lcsm = imp.load_source('lcsm', '/path/to/ukkonen.py') 
for record in SeqIO.parse('/path/to/sequences.txt', 'fasta'): 
    seqs.append(record) 
lcsm.main(seqs) 

Per l'algoritmo, ho avuto main() prendere un argomento, la variabile strings, ma questo invia l'algoritmo di un elenco di speciale BioPython Sequence objects, che il modulo re non piace. Così ho dovuto estrarre la stringa sequenza

suffix_tree.append_string(s) 

a

suffix_tree.append_string(str(s.seq)) 

che sembra sorta di fragile, ma questo è tutto quello che ho per ora.

7

Un'alternativa a utilizzare argparse nei notebook ipython sta passando una stringa a:

args = parser.parse_args() (. linea 303 dalla repo git si fa riferimento)

sarebbe qualcosa di simile:

parser = argparse.ArgumentParser(
     description='Searching longest common substring. ' 
        'Uses Ukkonen\'s suffix tree algorithm and generalized suffix tree. ' 
        'Written by Ilya Stepanov (c) 2013') 

parser.add_argument(
     'strings', 
     metavar='STRING', 
     nargs='*', 
     help='String for searching', 
    ) 

parser.add_argument(
     '-f', 
     '--file', 
     help='Path for input file. First line should contain number of lines to search in' 
    ) 

e

args = parser.parse_args("AAA --file /path/to/sequences.txt".split())

Edit: Funziona

+0

Non funziona :( – rjurney

+0

@mithrado @rjurney Quasi, questo funziona: 'args = parser.parse_args (['- file', '/path/to/sequences.txt'])', ad es.è necessario passare una serie di stringhe in cui ogni elemento è un argomento che normalmente sarebbe separato da uno spazio nella riga di comando. – jjs

+0

@jjs il modo per dividere automaticamente la sequenza è usare 'shlex.split':' args = parser.parse_args (shlex.split ("AAA --file /path/to/sequences.txt")) ' – zenpoy

1

Se ipython utilizzano per le prove poi trasformare in formato argparse classe può essere una soluzione rapida fittizio.

#!/usr/bin/env python 

from __future__ import print_function 
import sys 

def transform(): 
    if len(sys.argv) <2: 
     print('Usage : python arg2cls.py [target.py] [target2.py(optional)] ...') 
     sys.exit(0) 

    sys.argv.pop(0) 
    for fname in sys.argv: 
     if(__name__!='__main__'): 
      print(fname) 
     try : 
      with open(fname, 'r') as f: 
       txt = f.read() 
       t = txt.split('argparse.ArgumentParser') 
       if len(t) <2: 
        print('Nothing to make from file.') 
        sys.exit(0) 

       t = t[1].split('.parse_args')[0].split('add_argument') 
       t.pop(0) 

       name=[] 
       val=[] 
       for i, x in enumerate(t): 
        t =x.split('--')[1] 
        name.append(t.split('\'')[0].replace('-','_')) 
        dtype = '' 
        if('type' in t): 
         dtype = t.split('type=')[1].split(',')[0] 

        dfult = t.split('default=') 
        if len(dfult) <2: 
         val.append('###manual_setting_required###') 
        elif (dtype in ['int','float','long']): 
         val.append(dfult[1].split(',')[0].replace('\'','')) 
        else: 
         val.append(dfult[1].split(',')[0]) 

       print('') 
       print('class args:') 
       for i in zip(name,val): 
        print(' ',end='') 
        print(i[0],'=',i[1].replace('\"','')) 
       print('') 

     except IOError: 
      print('IOError : Maybe no such file.', fname) 

if(__name__ == "__main__"): 
    transform() 

questo script rende modulo argparse in formato classe, in modo non c'è bisogno di modificare altri codici interni. esempio Esecuzione:

python this_script.py target.py 

allora copiare & formato di pasta di classe per sostituire il vostro argparse. https://github.com/sngjuk/Argparse-to-class Questo repository offre anche la trasformazione rapida online. Spero che sarebbe utile per i test.

Problemi correlati