[英]How to call module written with argparse in iPython notebook
我正在嘗試將 BioPython 序列傳遞給Ilya Stepanov 在 iPython 的筆記本環境中實現 Ukkonen 的后綴樹算法。 我偶然發現了 argparse 組件。
我以前從來沒有直接處理過 argparse。 如何在不重寫 main() 的情況下使用它?
在 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.