Как вызвать модуль, написанный с помощью argparse, в блокноте iPython

Я пытаюсь передать последовательности BioPython реализации Ильи Степанова алгоритма суффиксного дерева Укконена в среде ноутбука iPython. Я натыкаюсь на компонент argparse.

Раньше мне никогда не приходилось иметь дело напрямую с argparse. Как я могу использовать это, не переписывая main()?

Между прочим, эта запись алгоритма Укконена просто фантастическая.


person Niels    schedule 05.06.2015    source источник


Ответы (9)


У меня уже была подобная проблема, но используя 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()
person BioGeek    schedule 05.06.2015
comment
Хороший. Просто добавьте фиктивный sys.argv, который работает как sys.argv = ['foo']. - person jef; 14.11.2017
comment
я не знаю, как долго я искал это решение, спасибо! - person Luca; 15.06.2021

Альтернативой использованию argparse в блокнотах Ipython является передача строки в:

args = parser.parse_args() (строка 303 из репозитория git, на который вы ссылались.)

Было бы что-то вроде:

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

Изменить: это работает

person tbrittoborges    schedule 05.06.2015
comment
@mithrado @rjurney Почти это работает: args = parser.parse_args(['--file', '/path/to/sequences.txt']), то есть вам нужно передать массив строк, где каждый элемент является аргументом, который обычно отделяется пробелом в командной строке. - person jjs; 11.05.2016
comment
@jjs способ автоматического разделения последовательности - использовать shlex.split: args = parser.parse_args(shlex.split("AAA --file /path/to/sequences.txt")) - person zenpoy; 30.07.2017

Использование args = parser.parse_args(args=[]) может решить проблему выполнения.

или Если вы хотите управлять параметрами как форматом класса, вы можете объявить его, как показано ниже.

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

args=Args()

страница Github предлагает веб-сервис преобразования. http://35.192.144.192:8000/arg2cls.html

person sngjuk    schedule 03.11.2017
comment
Для меня это был самый полезный способ добавить аргументы в блокнот Jupyter. Спасибо - person novastar; 13.04.2020

Если все аргументы имеют значение по умолчанию, то достаточно добавить это в начало записной книжки:

import sys
sys.argv = ['']

(иначе просто добавьте необходимые аргументы вместо пустой строки)

person nivniv    schedule 20.03.2020

В итоге я использовал BioPython для извлечения последовательностей, а затем отредактировал реализацию Ильи Стеанова, чтобы удалить методы 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, которые не нравятся модулю re. Поэтому мне пришлось извлечь строку последовательности

suffix_tree.append_string(s)

to

suffix_tree.append_string(str(s.seq))

который кажется хрупким, но это все, что у меня есть на данный момент.

person Niels    schedule 05.06.2015

Я сталкиваюсь с аналогичной проблемой при вызове argsparse, эта проблема вызывалась строкой «-f». Простое удаление этого из sys.srgv делает свое дело.

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

Очистить sys.argv

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

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

person hyun woo Cho    schedule 27.08.2019

Вот мой код, который работает хорошо, и я не буду беспокоиться об изменении среды.

import sys
temp_argv = sys.argv

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

Если вы не хотите изменять какие-либо аргументы и рабочие механизмы исходной функции argparse, которую вы написали или скопировали.

Чтобы программа работала, есть простое решение, которое работает в большинстве случаев.

Вы можете просто установить jupyter-argparser с помощью следующей команды:

pip install jupyter_argparser

Коды работают без изменений благодаря мейнтейнеру пакета.

person PaladiN    schedule 25.07.2020