簡體   English   中英

如何在 iPython 筆記本中調用用 argparse 編寫的模塊

[英]How to call module written with argparse in iPython notebook

我正在嘗試將 BioPython 序列傳遞給Ilya Stepanov 在 iPython 的筆記本環境中實現 Ukkonen 的后綴樹算法 我偶然發現了 argparse 組件。

我以前從來沒有直接處理過 argparse。 如何在不重寫 main() 的情況下使用它?

順便說一句,Ukkonen 算法的這篇文章很棒

在 Ipython 筆記本中使用 argparse 的另一種方法是將字符串傳遞給:

args = parser.parse_args() (您引用的 git repo 中的第 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())

編輯:它有效

使用args = parser.parse_args(args=[])將解決執行問題。

或者您可以將其聲明為類格式。

class Args:
  data = './data/penn'
  model = 'LSTM'
  emsize = 200
  nhid = 200

args=Args()

我以前遇到過類似的問題,但使用optparse而不是argparse

您無需更改原始腳本中的任何內容,只需為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()

如果所有參數都有默認值,那么將其添加到筆記本頂部就足夠了:

import sys
sys.argv = ['']

(否則,只需添加必要的參數而不是空字符串)

我最終使用 BioPython 來提取序列,然后編輯 Ilya 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 序列對象列表,這是 re 模塊不喜歡的。 所以我不得不提取序列字符串

suffix_tree.append_string(s)

suffix_tree.append_string(str(s.seq))

這似乎有點脆弱,但這就是我現在所擁有的。

我在調用 argsparse 時遇到了類似的問題,字符串 '-f' 導致了這個問題。 只需從 sys.srgv 中刪除它就可以了。

import sys
if __name__ == '__main__':
    if '-f' in sys.argv:
        sys.argv.remove('-f')
    main()

清理sys.argv

import sys; sys.argv=['']; del sys

https://github.com/spyder-ide/spyder/issues/3883#issuecomment-269131039

這是我的代碼,它運行良好,我不會擔心環境改變。

import sys
temp_argv = sys.argv

try:
    sys.argv = ['']
    print(sys.argv)
    args = argparse.parser_args()
finally:
    sys.argv = temp_argv
    print(sys.argv)

假設你在 python 中有這個小代碼:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
parser.add_argument("-v_1", "--verbose_1", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()

要在 Jupyter 筆記本中編寫此代碼,請編寫以下代碼:

import argparse

args = argparse.Namespace(verbose=False, verbose_1=False)

注意:在 python 中,您可以在運行時傳遞參數,但在 Jupyter notebook 中則不然,因此請注意參數的數據類型。

如果 iPython 環境傳遞的參數可以被忽略(不與指定的參數沖突),那么下面的工作就像一個魅力:

# REPLACE   args = parser.parse_args()   with:
args, unknown = parser.parse_known_args()

來自: https ://stackoverflow.com/a/12818237/11750716

如果您不想更改您編寫或復制的原始 argparse 函數的任何參數和工作機制。

為了讓程序正常工作,有一個在大多數情況下都可以工作的簡單解決方案。

您可以使用以下命令安裝jupyter-argparser

pip install jupyter_argparser

由於包的維護者,代碼無需任何更改即可工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM