【问题标题】:argparse works when calling script but not when incorporated to new scriptargparse 在调用脚本时有效,但在合并到新脚本时无效
【发布时间】:2020-09-14 07:36:50
【问题描述】:

这是我的基本问题:

我有以下几点: 文件名:parseFastq.py 执行:通过命令行 运行它的代码:python3 parseFastq.py --fastq /Users/remaining_dir/test1.fastq

此代码有效!!!

但是,当我复制 parseFastq.py 的组件时,就会出现问题。

下面是代码:

首先定义类...这部分可以在我的新脚本上正常运行。

import argparse
import gzip
#Example use is 
# python parseFastq.py --fastq /Users/remaining_dir/test1.fastq

################################################
# You can use this code and put it in your own script
class ParseFastQ(object):
    """Returns a read-by-read fastQ parser analogous to file.readline()"""
    def __init__(self,filePath,headerSymbols=['@','+']):
        """Returns a read-by-read fastQ parser analogous to file.readline().
        Exmpl: parser.__next__()
        -OR-
        Its an iterator so you can do:
        for rec in parser:
            ... do something with rec ...

        rec is tuple: (seqHeader,seqStr,qualHeader,qualStr)
        """
        if filePath.endswith('.gz'):
            self._file = gzip.open(filePath)
        else:
            self._file = open(filePath, 'rU')
        self._currentLineNumber = 0
        self._hdSyms = headerSymbols

    def __iter__(self):
        return self

    def __next__(self):
        """Reads in next element, parses, and does minimal verification.
        Returns: tuple: (seqHeader,seqStr,qualHeader,qualStr)"""
        # ++++ Get Next Four Lines ++++
        elemList = []
        for i in range(4):
            line = self._file.readline()
            self._currentLineNumber += 1 ## increment file position
            if line:
                elemList.append(line.strip('\n'))
            else: 
                elemList.append(None)

        # ++++ Check Lines For Expected Form ++++
        trues = [bool(x) for x in elemList].count(True)
        nones = elemList.count(None)
        # -- Check for acceptable end of file --
        if nones == 4:
            raise StopIteration
        # -- Make sure we got 4 full lines of data --
        assert trues == 4,\
               "** ERROR: It looks like I encountered a premature EOF or empty line.\n\
               Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._currentLineNumber)
        # -- Make sure we are in the correct "register" --
        assert elemList[0].startswith(self._hdSyms[0]),\
               "** ERROR: The 1st line in fastq element does not start with '%s'.\n\
               Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._hdSyms[0],self._currentLineNumber) 
        assert elemList[2].startswith(self._hdSyms[1]),\
               "** ERROR: The 3rd line in fastq element does not start with '%s'.\n\
               Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._hdSyms[1],self._currentLineNumber) 
        # -- Make sure the seq line and qual line have equal lengths --
        assert len(elemList[1]) == len(elemList[3]), "** ERROR: The length of Sequence data and Quality data of the last record aren't equal.\n\
               Please check FastQ file near line number %s (plus or minus ~4 lines) and try again**" % (self._currentLineNumber) 

        # ++++ Return fatsQ data as tuple ++++
        return tuple(elemList)
##########################################################################

这是在同一脚本中调用时不起作用的代码;它与放入碎片有关:

if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Process fasq files and seperaate into 4 categories')
parser.add_argument("-f",  "--fastq", required=True, help="Place fastq inside here")
args = parser.parse_args()

fastqfile = ParseFastQ(args.fastq)

我尝试了以下方法,但无法获取包含以下元组的 fastqfile:(seqHeader,seqStr,qualHeader,qualStr)

尝试:

parser.add_argument("-/Users/remaining_dir/test1.fastq",  "--fastq", required=True, help="Place fastq inside here")

错误:

argument -/Users/remaining_dir/test1.fastq/--fastq: conflicting option string: --fastq

尝试:

parser.add_argument("-/Users/remaining_dir/test1.fastq",  "-@", required=True, help="Place fastq inside here")

输出[332]:

_StoreAction(option_strings=['-/Users/remaining_dir/test1.fastq', '-@'], dest='/Users/remaining_dir/test1.fastq', nargs=None, const=None, default=None, type=None, choices=None, help='Place fastq inside here', metavar=None)

下一行:

错误:

usage:  [-h] -/Users/remaining_dir/test1.fastq
        /USERS/REMAINING_DIR/TEST1.FASTQ
: error: the following arguments are required: -/Users/remaining_dir/test1.fastq/-@
An exception has occurred, use %tb to see the full traceback.

SystemExit: 2

 when %tb selected the following info was give: 
 File "/Users/brownbear/opt/anaconda3/lib/python3.7/argparse.py", line 2508, in error
    self.exit(2, _('%(prog)s: error: %(message)s\n') % args)

  File "/Users/brownbear/opt/anaconda3/lib/python3.7/argparse.py", line 2495, in exit
    _sys.exit(status)

如果有帮助,我会附上一些示例 fastq 数据

@seq13534-419
GCAGTAGCGGTCATAAGTGGTACATTACGAGATTCGGAGTACCATAGATTCGCATGAATCCCTGTGGATACGAGAGTGTGAGATATATGTACGCCAATCCAGTGTGATACCCATGAGATTTAGGACCGATGATGGTTGAGGACCAAGGATTGACCCGATGGATGCAGATTTGACCCCAGATAGAATAAATGCGATGAGATGATTTGGCCGATAGATAGATAGTGTCGTGAGGTGACGTCCGTCACTGGACGAA
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFFFFDFFDFFDDFDFDFFFFDDFFDDFDDFF
@seq86249-867
GGATTAGCGGTCATAAGTCGTACATTACGAGATTCGGAGTACCATAGATTCGCATGAATCCCTGTGGATACGAGAGTGTGAGATATATGTACGCCAATCCAGTGTGATACCCATGAGATTTAGGACCGATGATGGTTGAGGACCAAGGATTGACCCGATGGATGCAGATTTGACCCCAGATAGAATAAATGCGATGAGATGATTTGGCCGATAGATAGATAGAGGTCAGTATAACCTCTCAAAGCTTTATCTACGGATGGATCCGCGC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDDFDDDDDDFFDFDDFDDDFDFFDDFFFFFFFFFDDFDFFDDFDDF
@seq46647-928
GACCTAGCGGTCATAAGTGGTACATTACGAGATTCGGAGTACCATAGATTCGCATGAATCCCTGTGGATACGAGAGTGTGAGATATATGTACGCCAATCCAGTGTGATACCCATGAGATTTAGGACCGATGATGGTTGACGACCAAGGATTGACCCGATGGATGCAGATTTGACCCCAGATAGAATAAATGCGATGAGATGATTTGGCCGATAGATAGATAGTAAGTAAATGCCACGGACTCGTCACGTG
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIDDDFDFDFFFFFDFFDFDFDDDDDFDFF

如果我在运行脚本但现在尝试合并到脚本中时,任何帮助将不胜感激

【问题讨论】:

  • 当您说This is the code that will not work when calling it in the same script; it has to do with putting the pieces in 以及在展示尝试其他事物的示例之后立即不清楚您的意思。你试试第一个代码sn-p吗?如果有的话,它会给出什么错误或输出?它的缩进与您显示的完全一样吗?
  • 脚本A,为原创脚本,可在线命令调用。脚本A的所有内容都将复制到脚本B。在脚本B上逐行运行时出现错误。该类运行顺利;但是,当您尝试使用 agparse 添加 var-args 时,它会失败:
  • 带有if __name__ == "__main__": 的代码sn-p 是脚本A 的一部分吗?如果是这样,它在脚本 A 中是否有效?
  • @Axe319 它运行良好
  • 以这个工作示例parser.add_argument("-f", "--fastq", required=True, help="Place fastq inside here")为例。所有这一切都是说,您可以从命令行指定python my_script.py -f /my/file/pathpython my_script.py --fastq /my/file/path,然后在使用args = parser.parse_args() 解析参数后,args.fastq 变量将保存您传递给它的任何字符串。在这个例子中/my/file/path.

标签: python-3.x integration argparse runpy


【解决方案1】:

解决方案分为两个主要部分

我试图通过 IDE (Spyder) 运行 argparse,并且只运行选定的代码而不是整个脚本。

对于那些不熟悉 python 并且第一次使用 argparse 的人......这个工具只在从命令行调用时才有效。

因此,一旦您创建了 args 表

你会运行如下L

从命令行:

python3 parseFastq.py --fastq test1.fastq 

为了从初始设置中进一步分解,您基本上是将 test1.fastq 文件标记为标签 --fastq... 这很关键,如果您收到错误,表明它需要以特定格式是你必须成对添加它们......在这个特定的例子中,你也可以用“-f”的简写来标记。因此,它也可以运行为...

从命令行:

python3 parseFastq.py -f test1.fastq 

只要您的 py 脚本与您调用的文件在同一目录中运行,您就不需要完整的扩展名。

【讨论】:

    【解决方案2】:

    要按照我的理解回答您的问题,您可以像这样简单地向解析器添加另一个参数。

    if __name__ == "__main__":
        parser = argparse.ArgumentParser(description='Process fasq files and seperaate into 4 
                categories')
        parser.add_argument("-f",  "--fastq", required=True, help="Place fastq inside here")
        parser.add_argument("-t",  "--type", required=True, help="The type of file")
        args = parser.parse_args()
    
        print(args.fastq)
        print(args.type)
    

    然后这样称呼它。

    python3 parseFastq.py --fastq /Users/remaining_dir/test1.fastq --type fastq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2020-09-08
      • 2014-07-31
      • 1970-01-01
      • 2014-03-05
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多