FASTQC在命令行上运行,但不在python子进程中运行(Java异常)

2024-10-01 22:27:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的命令行工具在从Linux命令行调用它时工作正常,但是当我通过Python subprocess模块调用它时会出现异常。我已经看过了以前的文章,但是没有一篇文章涉及到它如何在命令行上工作,但在Python中却没有。在

这是我得到的回溯样本:

Exception in thread "Thread-1" java.lang.Error: Probable fatal error:No fonts found.
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1236)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1100)
at sun.font.SunFontManager.findOtherDeferredFont(SunFontManager.java:1037)
at sun.font.SunFontManager.findDeferredFont(SunFontManager.java:1054)
at sun.font.SunFontManager.findFont2D(SunFontManager.java:2256)
at sun.font.SunFontManager.getDefaultPhysicalFont(SunFontManager.java:1220)
at sun.font.SunFontManager.initialiseDeferredFont(SunFontManager.java:1106)
at sun.font.CompositeFont.doDeferredInitialisation(CompositeFont.java:263)
at sun.font.CompositeFont.getSlotFont(CompositeFont.java:352)
at sun.font.CompositeStrike.getStrikeForSlot(CompositeStrike.java:78)
at sun.font.CompositeStrike.getFontMetrics(CompositeStrike.java:93)
at sun.font.FontDesignMetrics.initMatrixAndMetrics(FontDesignMetrics.java:359)
at sun.font.FontDesignMetrics.<init>(FontDesignMetrics.java:350)
at sun.font.FontDesignMetrics.getMetrics(FontDesignMetrics.java:302)
at sun.java2d.SunGraphics2D.getFontMetrics(SunGraphics2D.java:855)
at uk.ac.babraham.FastQC.Graphs.QualityBoxPlot.paint(QualityBoxPlot.java:88)
at javax.swing.JComponent.print(JComponent.java:1202)
at uk.ac.babraham.FastQC.Modules.AbstractQCModule.writeDefaultImage(AbstractQCModule.java:68)
at uk.ac.babraham.FastQC.Modules.PerBaseQualityScores.makeReport(PerBaseQualityScores.java:199)
at uk.ac.babraham.FastQC.Report.HTMLReportArchive.<init>(HTMLReportArchive.java:131)
at uk.ac.babraham.FastQC.Analysis.OfflineRunner.analysisComplete(OfflineRunner.java:178)
at uk.ac.babraham.FastQC.Analysis.AnalysisRunner.run(AnalysisRunner.java:110)
at java.lang.Thread.run(Thread.java:745)

我这样称呼这个工具:

^{pr2}$

因为命令是我在命令行上运行它的同一个命令。在

我检查以确保从命令行调用的java版本与使用subprocess调用的版本相同。在subprocess中运行环境时,可能会以某种方式修改环境,但是如何确保字体包在java中使用呢?在


Tags: javaacatsunfastqcfontukbabraham
1条回答
网友
1楼 · 发布于 2024-10-01 22:27:55

下面是我用python运行fastqc的代码。它使用subprocess.check_调用而不是波本。在

def run(fastq_path, output_dir, options=[' extract',]):
    """
    Run the fastqc program on a specified fastq file and return the output directory path.

    Parameters
         
    fastq_path : str
        Path to the fastq file to analyze.
    output_dir : str
        Directory where output will be written. It will be created if it does not exist.
    options : list of str (optional)
        Command-line flags and options to fastqc. Default is  extract.

    Returns
       -
    output_dir : str
        The path to the directory containing the detailed output for this fastq file.
        It will be a subdirectory of the specified output dir.
    """
    utils.mkdir_p(output_dir)

    command = "fastqc {} -o {} {}".format(' '.join(options), output_dir, fastq_path)
    subprocess.check_call(command, shell=True)

    # Fastqc creates a directory derived from the basename
    fastq_dir = os.path.basename(fastq_path)
    if fastq_dir.endswith(".gz"):
        fastq_dir = fastq_dir[0:-3]
    if fastq_dir.endswith(".fq"):
        fastq_dir = fastq_dir[0:-3]
    if fastq_dir.endswith(".fastq"):
        fastq_dir = fastq_dir[0:-6]
    fastq_dir = fastq_dir + "_fastqc"

    # Delete the zip file and keep the uncompressed directory
    zip_file = os.path.join(output_dir, fastq_dir + ".zip")
    os.remove(zip_file)

    output_dir = os.path.join(output_dir, fastq_dir)
    return output_dir

相关问题 更多 >

    热门问题