2015-06-05 15 views
5

मैं IPython के नोटबुक वातावरण में Ilya Stepanov's implementation of Ukkonen's suffix tree algorithm को BioPython दृश्यों पारित करने के लिए कोशिश कर रहा हूँ में argparse के साथ लिखा मॉड्यूल कॉल करने के लिए। मैं Argparse घटक पर ठोकर खा रहा हूँ।कैसे IPython नोटबुक

मैंने पहले argparse के साथ सीधे सामना करना पड़ा कभी नहीं किया है। मुख्य() को फिर से लिखने के बिना मैं इसका उपयोग कैसे कर सकता हूं?

द्वारा रखकर this writeup of Ukkonen's algorithm is fantastic

उत्तर

6

मेरे पास a similar problem before, है लेकिन argparse के बजाय optparse का उपयोग कर रहा है।

आप मूल स्क्रिप्ट में कुछ भी बदलने की, सिर्फ इसलिए की तरह sys.argv को एक नई सूची आवंटित की जरूरत नहीं है:

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

अच्छा लगा। बस 'sys.argv = [' foo '] जैसे डमी 'sys.argv' कार्यों को जोड़ें। – jef

1

मैं BioPython का उपयोग कर दृश्यों को निकालने के लिए और उसके बाद इल्या Steanov के कार्यान्वयन संपादन 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) 

एल्गोरिथ्म के लिए, मैं main() एक तर्क है, उसकी strings चर लेने के लिए किया था, लेकिन इस एल्गोरिथ्म जो फिर से मॉड्यूल पसंद नहीं करता है विशेष BioPython Sequence objects की एक सूची, भेजता है। इसलिए मैं

suffix_tree.append_string(str(s.seq)) 

जो एक तरह से भंगुर लगता है अनुक्रम स्ट्रिंग

suffix_tree.append_string(s) 

निकालने के लिए किया था, लेकिन वह सब मैं अब के लिए मिल गया है है।

7

IPython पुस्तिकाओं में argparse उपयोग करने के लिए एक वैकल्पिक करने के लिए एक स्ट्रिंग गुजर रहा है:

args = parser.parse_args() (। Git रेपो आप संदर्भित से लाइन 303)

होगा कुछ की तरह:

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

और

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

संपादित करें: यह

+0

काम करता है नहीं :( – rjurney

+0

@mithrado @rjurney लगभग, इस काम करता है: 'आर्ग = parser.parse_args ([ '- फ़ाइल', '/path/to/sequences.txt'])', अर्थातआपको तारों की एक सरणी पारित करने की आवश्यकता है जहां प्रत्येक तत्व एक तर्क है जिसे सामान्यतः कमांड लाइन में किसी स्थान से अलग किया जाएगा। – jjs

+0

@jjs अनुक्रम को स्वचालित रूप से विभाजित करने का तरीका 'shlex.split' का उपयोग करना है:' args = parser.parse_args (shlex.split ("AAA --file /path/to/sequences.txt")) ' – zenpoy

1

काम करता है आप परीक्षण तो वर्ग प्रारूप में argparse बदलने के लिए IPython का उपयोग करते हैं एक त्वरित डमी समाधान हो सकता है।

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

यह स्क्रिप्ट क्लास प्रारूप में argparse मॉड्यूल बनाता है, इसलिए आपको अन्य आंतरिक कोड संपादित करने की आवश्यकता नहीं है। निष्पादन उदाहरण:

python this_script.py target.py 

तो आप अपने argparse को बदलने के लिए & पेस्ट वर्ग प्रारूप की प्रतिलिपि बनाएँ। https://github.com/sngjuk/Argparse-to-class यह रेपो ऑनलाइन त्वरित परिवर्तन भी प्रदान करता है। आशा है कि यह आपके परीक्षण के लिए सहायक होगा।

संबंधित मुद्दे