【问题标题】:How to call module written with argparse in iPython notebook如何在 iPython 笔记本中调用用 argparse 编写的模块
【发布时间】:2015-08-19 19:52:51
【问题描述】:

我正在尝试将 BioPython 序列传递给 iPython 笔记本环境中的 Ilya Stepanov's implementation of Ukkonen's suffix tree algorithm。我偶然发现了 argparse 组件。

我以前从未直接处理过 argparse。如何在不重写 main() 的情况下使用它?

作者this writeup of Ukkonen's algorithm is fantastic

【问题讨论】:

    标签: python ipython bioinformatics biopython suffix-tree


    【解决方案1】:

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

    编辑:它有效

    【讨论】:

    • @mithrado @rjurney 差不多,这行得通:args = parser.parse_args(['--file', '/path/to/sequences.txt']),即您需要传递一个字符串数组,其中每个元素都是一个参数,通常在命令行中用空格分隔。
    • @jjs 自动分割序列的方法是使用shlex.split:args = parser.parse_args(shlex.split("AAA --file /path/to/sequences.txt"))
    【解决方案2】:

    我有a similar problem before,,但使用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()
    

    【讨论】:

    • 不错。只需添加虚拟sys.argv 就像sys.argv = ['foo'] 一样工作。
    • 我不知道我搜索这个解决方案多久了,谢谢!
    【解决方案3】:

    使用args = parser.parse_args(args=[]) 可以解决执行问题。

    或者如果你想以类格式管理参数,你可以声明如下。

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

    Github page repo 提供转换网络服务。 http://35.192.144.192:8000/arg2cls.html

    【讨论】:

    • 对我来说,这是向 Jupyter notebook 添加参数的最有用的方法。谢谢
    【解决方案4】:

    如果所有参数都有默认值,那么将其添加到笔记本顶部就足够了:

    import sys
    sys.argv = ['']
    

    (否则,只需添加必要的参数而不是空字符串)

    【讨论】:

      【解决方案5】:

      我最终使用 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 Sequence objects 列表,re 模块不喜欢这些列表。所以我不得不提取序列字符串

      suffix_tree.append_string(s)
      

      suffix_tree.append_string(str(s.seq))
      

      这似乎有点脆弱,但这就是我现在所拥有的。

      【讨论】:

        【解决方案6】:

        我在调用 argsparse 时遇到了类似的问题,字符串 '-f' 导致了这个问题。只需从 sys.srgv 中删除它就可以了。

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

        【讨论】:

          【解决方案7】:

          清理sys.argv

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

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

          【讨论】:

            【解决方案8】:

            这是我的代码,运行良好,我不用担心环境改变了。

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

            【讨论】:

            • 这对我有用!
            【解决方案9】:

            如果您不想更改您编写或复制的原始 argparse 函数的任何参数和工作机制。

            为了让程序正常工作,有一个在大多数情况下都可以正常工作的简单解决方案。

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

            pip install jupyter_argparser
            

            感谢包的维护者,代码无需任何更改即可工作。

            【讨论】:

              猜你喜欢
              • 2018-12-16
              • 1970-01-01
              • 2015-01-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-21
              相关资源
              最近更新 更多