0

私はjythonプログラムをテストしています。これは、["。xls"、 "。doc"、 "。rtf"、 "。tif"、 "。tiff"、"。pdf"ファイル]->pdf(中間ファイル)を実行します。 -> Open Officeを使用したtif(最終出力)変換。自動化に問題があったため、MSOfficeから離れました。ショーストッパーエラーに関連する多くのボトルをノックダウンし、残りのボトルは1本になっているようです。しばらくするとOOがハングします。

コード内でこの行'<<<<<<<<<<<<'が表示されている場合に発生します

行き詰まったOpenOfficeプロセスを処理するための正しい方法は何ですか。役立つリンクを提供していただけませんか。また、途中で良い提案をしてください。
また、もう1つ質問があります。

要約:
*停止したOpen Officeインスタンスを処理する方法は?
* Javaヘッドレスで変換を行う方法。これにより、メモリを浪費するGUIが常にポップアップ表示されることはありません。
*また、コードの品質、最適化、および一般的なコーディング標準に関する一般的な提案をいただければ幸いです。


トレースバック(最も内側の最後):
ファイル "dcmail.py"、行184、?
ファイル"dcmail.py"、行174、メイン
ファイル "C:\ DCMail \ digestemails.py"、行126、process_inbox
ファイル "C:\ DCMail \ digestemails.py"、行258、_convert
ファイル "C: \ DCMail \ digestemails.py "、284行目、_choose_conversion_type
ファイル" C:\ DCMail \ digestemails.py "、287行目、_open_office_convert
ファイル" C:\ DCMail \ digestemails.py "、299行目、_load_attachment_to_convert
com.sun .star.lang.DisposedException:
com.sun.star.lib.uno.bridges.java_remote.java_remote_bridge $ MessageDi spatcher.run(java_remote_bridge.java:176)での java.io.EOFException

com.sun.star.lang.DisposedException:com.sun.star.lang.DisposedException:java.i o.EOFException

この例外をクリアするためだけに、オープンオフィスプロセスを強制終了した場合にのみスローされます。それ以外の場合、プログラムはオープンオフィスが完了するのを待つだけです。無期限に


コード(機能しないコードタグ付き)

[コード]

#ghost script handles these file types  
GS_WHITELIST=[".pdf"]  
#Open Office handles these file types  
OO_WHITELIST=[".xls", ".doc", ".rtf", ".tif", ".tiff"]   
#whitelist is used to check against any unsupported files.  
WHITELIST=GS_WHITELIST + OO_WHITELIST   
def _get_service_manager(self):
    try:
        self._context=Bootstrap.bootstrap();
        self._xMultiCompFactory=self._context.getServiceManager()
        self._xcomponentloader=UnoRuntime.queryInterface(XComponentLoader, self._xMultiCompFactory.createInstanceWithContext("com.sun.star.frame.Desktop", self._context))
    except:
        raise OpenOfficeException("Exception Occurred with Open Office")

def _choose_conversion_type(self,fn):
    ext=os.path.splitext(fn)[1]
    if ext in GS_WHITELIST:
        self._ghostscript_convert_to_tiff(fn)
    elif ext in OO_WHITELIST:
        self._open_office_convert(fn)

def _open_office_convert(self,fn):
    self._load_attachment_to_convert(fn)
    self._save_as_pdf(fn)
    self._ghostscript_convert_to_tiff(fn)

def _load_attachment_to_convert(self, file):
    file=self._create_UNO_File_URL(file)
    properties=[]
    p=PropertyValue()
    p.Name="Hidden"
    p.Value=True
    properties.append(p)
    properties=tuple(properties) 
    self._doc=self._xcomponentloader.loadComponentFromURL(file, "_blank",0, properties) <<<<<<<<<<<<<<< here is line 299

def _create_UNO_File_URL(self, filepath):
    try:
        file=str("file:///" + filepath)
        file=file.replace("\\", "/")
    except MalformedURLException, e:
        raise e
    return file

def _save_as_pdf(self, docSource):
    dirName=os.path.dirname(docSource)
    baseName=os.path.basename(docSource)
    baseName, ext=os.path.splitext(baseName)
    dirTmpPdfConverted=os.path.join(dirName + DIR + PDF_TEMP_CONVERT_DIR)
    if not os.path.exists(dirTmpPdfConverted):
        os.makedirs(dirTmpPdfConverted)
    pdfDest=os.path.join(dirTmpPdfConverted + DIR + baseName + ".pdf")
    url_save=self._create_UNO_File_URL(pdfDest)
    properties=self._create_properties(ext)
    try:
        try:
            self._xstorable=UnoRuntime.queryInterface(XStorable, self._doc);
            self._xstorable.storeToURL(url_save, properties)
        except AttributeError,e:
                self.logger.info("pdf file already created (" + str(e) + ")")
                raise e
    finally:
        try:
            self._doc.dispose()
        except:
            raise

def _create_properties(self,ext):
    properties=[]
    p=PropertyValue()
    p.Name="Overwrite"
    p.Value=True
    properties.append(p)
    p=PropertyValue()
    p.Name="FilterName"
    if   ext==".doc":
        p.Value='writer_pdf_Export'
    elif ext==".rtf":
        p.Value='writer_pdf_Export'
    elif ext==".xls":
        p.Value='calc_pdf_Export'
    elif ext==".tif":
        p.Value='draw_pdf_Export'
    elif ext==".tiff":
        p.Value='draw_pdf_Export'
    properties.append(p)
    return tuple(properties)

def _ghostscript_convert_to_tiff(self, docSource):
    dest, source=self._get_dest_and_source_conversion_file(docSource)
    try:
        command = ' '.join([
            self._ghostscriptPath + 'gswin32c.exe',
           '-q',
           '-dNOPAUSE',
           '-dBATCH',
           '-r500',
           '-sDEVICE=tiffg4',
           '-sPAPERSIZE=a4',
           '-sOutputFile=%s %s' % (dest, source),
           ])
        self._execute_ghostscript(command)
        self.convertedTifDocList.append(dest)
    except OSError, e:
        self.logger.info(e)
        raise e
    except TypeError, (e):
        raise e
    except AttributeError, (e):
        raise e
    except:
        raise

[/コード]

4

2 に答える 2

1

厄介な解決策は、OpenOffice プロセスのモニターを用意することです。モニターが PID を認識し、特権を持っている場合、数秒ごとに使用される CPU 時間を取得できます。OO が停止状態 (CPU がない) でハングした場合、モニターはそれを強制終了できます。

これを処理する最も簡単な方法は、オープン オフィス タスクを起動する "ラッパー" に実行中のタスクを監視させ、ハングしたときに強制終了させることです。親プロセスはとにかく待機する必要があるため、監視することもできます。

OpenOffice がループ状態でハングアップすると、見つけるのが難しくなります。CPU は通常、屋根を通り抜けてそこにとどまり、優先度は可能な限り低い優先度に急落します。処理中ですか、それともハングしていますか? ジャッジメントコール。このように「しばらく」ハングアップさせる必要があります (ランダムな期間を選択します。たとえば、432 秒 (3 ダース ダース) を選択します。常に自分自身を推測することになります。)

于 2008-11-19T11:26:53.210 に答える
1

OpenOffice.org には、GUI なしで実行するための「-headless」パラメーターがあります。これにより、GUI に費やされるすべてのリソースが実際に解放されるかどうかはわかりません。サーバー側のヘッドレス インスタンスを実行する方法は次のとおりです。

soffice -headless -accept="socket,port=1234;urp" -display :25

Python スクリプトの停止問題の原因はわかりませんが、PyODConverterを調べて、このスクリプトの動作が異なることを確認して、問題の原因となっているエラーをキャッチすることをお勧めします。

于 2008-11-19T09:48:45.890 に答える