windows - Python og Ghostscript: OSError: For mange åbne filer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg kører ghostscript via python 2.7 på Windows for at konvertere en flok 1-sidede PDF-filer til TIFF-billeder.


from os import listdir, remove
from os.path import isfile, join
import ghostscript
import os
import time
import sys

#Assumption #1: The input folder, output\_tif\_folder and output\_pdf\_folder
#Assumption #2: Paths in windows use a backslash for reference. They have to be escaped characters - so use a \ instead of a single 
#   eg: 'C:\Users\User\Desktop\Folder\'
#Assumption #3: Required libraries are configured and installed properly. They are - i) ghostscript and ii) pyPdf

input\_folder = 'C:\Users\User\Desktop\Folder\test\_files\'; #Has to be the absolute path, ending with a slash
output\_pdf\_folder = 'C:\Users\User\Desktop\Folder\pdf\'; #Has to be an absolute path too, ending with a slash
output\_tif\_folder = 'C:\Users\User\Desktop\Folder\tif\' #Absolute path too, ending with a slash

onlyfiles = [f for f in listdir(input\_folder) if isfile(join(input\_folder, f))]

from pyPdf import PdfFileWriter, PdfFileReader

for pdfFile in onlyfiles:
    inputpdf = PdfFileReader(open(input\_folder + pdfFile, 'rb'))
    for i in xrange(inputpdf.numPages):
        output = PdfFileWriter()
        output.addPage(inputpdf.getPage(i))
        with open(output\_pdf\_folder + pdfFile[:-4] + "\_\%s.pdf" \% (i+1), "wb") as outputStream:
            output.write(outputStream)

def convertPdfTiff(inputfilename, outputfilename):
    args = [
    "pdf2tif", # actual value doesn't matter
    "-dNOPAUSE", "-dBATCH", "-dSAFER",
    "-sDEVICE=tiff24nc",
    "-sCompression=pack",
    "-sOutputFile=" + outputfilename,
    "-f",  inputfilename
    ]
    try:
        ghostscript.Ghostscript(*args)
    except:
        print 'something went wrong'

pagefiles = [f for f in listdir(output\_pdf\_folder) if isfile(join(output\_pdf\_folder, f))]
for pagefile in pagefiles:
    print 'Input: ' + output\_pdf\_folder + pagefile
    print 'Output: ' + output\_tif\_folder + pagefile[:-4] + ".tif"
    convertPdfTiff(output\_pdf\_folder + pagefile, output\_tif\_folder + pagefile[:-4] + ".tif")
    time.sleep(1)


Efter at have konverteret omkring 114 filer får jeg følgende fejl -
OSError: Too many open files


Andre stillinger om lignende problemer tyder på, at filbeskrivelser skal lukkes yndefuldt, men da jeg ikke åbner dem (jeg antager ghostscript gør det), kan jeg ikke lukke dem.


Hvad er den bedste måde at håndtere denne situation på?

Bedste reference


Jeg er ikke en Python-udvikler, men det forekommer mig, at du åbner filer (undskyld hvis jeg er forkert):


for pdfFile in onlyfiles:
    inputpdf = PdfFileReader(open(input\_folder + pdfFile, 'rb'))


Jeg kan ikke se, hvor du lukker disse filer. Andet end det, skal Ghostscript helt sikkert lukke alle sine egne filer, selvom jeg har set Windows tage lidt tid til at lukke filer, når GS har kasseret dem. Du kan prøve at sætte længere time.sleep () der for at se om det hjælper.


Det er helt sikkert muligt at udføre dette fra kommandolinjen (dvs. at bruge Ghostscript direkte i stedet for at bruge DLL'en som du synes at være) og behandle hundredvis af filer. Da Ghostscript executable bruger den samme DLL, bør der ikke være et problem ved at bruge det på denne måde.