2015-06-05 17 views

cevap

6

a similar problem before,, ancak argparse yerine optparse kullanıyorum.

Sadece şöyle sys.argv için yeni bir liste atamak, orijinal senaryoda herhangi bir değişiklik gerekmez:

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

Güzel. Sadece ekleyin kukla 'sys.argv' sys.argv = ['foo']' gibi çalışır. – jef

1

Dizileri ayıklamak ve sonra da Argparse yöntemlerini kaldırmak için Ilya Steanov'un uygulamasını düzenlemek için BioPython kullanarak sona erdim.

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) 

algoritması için, ben main() bir argüman, onun strings değişkeni almak vardı, ama bu algoritmasını yeniden modülü sevmez özel BioPython Sequence objects bir listesini gönderir. Yani ben tür kırılgan görünüyor

suffix_tree.append_string(str(s.seq)) 

için sıra dizesi

suffix_tree.append_string(s) 

ayıklamak zorunda kaldı, ama ben şimdilik bir tek bu var.

7

ipython defterlerde argparse kullanmak alternatif bir dize geçiyor:

args = parser.parse_args() (. Eğer başvurulan git repo satır 303)

olurdu gibi bir şey:

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

ve

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

Düzenleme: Hızlı bir kukla çözüm olabilir sonra sınıf biçime argparse dönüştüren test için IPython kullanırsanız O

+0

Çalışmıyor :( – rjurney

+0

@mithrado @rjurney Neredeyse, bu çalışma: 'args = parser.parse_args (['- dosya', '/path/to/sequences.txt'])', i.e.Her elemanın normalde komut satırındaki bir boşlukla ayrılacak bir argüman olduğu bir dizi diziyi geçmeniz gerekir. – jjs

+0

Jjs diziyi otomatik olarak ayırma yolu "shlex.split" işlevini kullanmaktır: args = parser.parse_args (shlex.split ("AAA --file /path/to/sequences.txt")) ' – zenpoy

1

çalışır.

#!/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() 

Bu betik argparse modülünü sınıf biçimine dönüştürür, böylece diğer iç kodları düzenlemeniz gerekmez. Yürütme örnek:

python this_script.py target.py 

o zaman argparse yerine & macun sınıf biçimi kopyalayın. https://github.com/sngjuk/Argparse-to-class Bu repo ayrıca Çevrimiçi hızlı dönüşüm sunuyor. Umarım test için faydalı olur.

İlgili konular