Die Python-UNO-Brücke 出身の OpenOffice.org
- Einführung- Status
- Tutorial
-- PyUNO-取り付け・設備
-- PyUNO-Brücken-Modi
-- Mehr Beispiele
- UNO Sprachanbindung
-- UNO Typen-Mapping
-- UNO-Objekte implementieren
-- UNO-Komponenten implementieren
-- Umgang mit Ausgabeparametern
-- Umgang mit Exceptions
-- Aktuelle Kontext-Unterstützung (seit OOo 2.0.2)
-- Das unohelper-Modul
-- Logging (seit OOo 2.0.2)
- Abhängigkeiten
- Bootstrapping in Nicht-OOo-Umgebungen
- Ersetzen der Python-Laufzeitumgebung
- Regressiontests
- Externe Verweise
- Häufig gestellte Fragen (FAQ) (Lesen Sie dies ZUERST, wenn Sie Probleme haben)
- Bekannte PyUNO-Erweiterungen für OOo
- PyUNO braucht Sie
- Autoren
- Lizenz
Einführung
Die Python-UNO-Brücke erlaubt
- die 基準-OpenOffice.org-API 出身の der sehr wohl-bekannten Python-Skriptsprache aus zu benutzen.
- UNO-Komponenten in Python zu entwickeln, so dass Python-UNO-Komponenten innerhalb des OpenOffice.org-Prozesses ablaufen können und aus Java, C++ oder der in OpenOffice.org enthaltenen Skriptsprache StarBasic aufgerufen werden können.
- das Erstellen und Aufrufen 出身の Skripten mit dem Office-Skripting-枠組み (OOo 2.0 und später).
Sie können die aktuellste 見解/翻訳/版 dieses Dokuments unter http://udk.openoffice.org/python/python-橋(渡しをする).html finden (englische Sprache).
Status
Die Python-UNO-Brücke ist komplett funktionfähig, aber sie ist noch nicht extensiv genutzt worden, so dass sie eventuell noch einige Fehler enthält. Sie ist 修道女 in den OpenOffice.org-Quellcode-Baum integriert (OpenOffice.org 1.0.x wird nicht unterstützt.).
Die Dokumentation zielt in ihrem aktuellen Status auf Entwickler, die bereits einige Erfahrungen mit dem OpenOffice.org-API und mit einigen anderen Programmiersprachen (Java/C++/StarBasic) haben. Es ist empohlen, dass Sie einige Hintergrundinformationen aus dem Entwicklerhandbuch lesen, bevor Sie auf Besonderheiten 出身の Python schauen.
PyUNO-Tuturial für OpenOffice.org
Dieses Tuturial zeigt, wie die PyUNO-Brücke benutzt werden kann, um OpenOffice.org zu automatisieren. Dies ist kein OpenOffice.org-Tuturial. Es sind eine Menge an Ressourcen in dem Office-開発-道具 und in dem Entwicklerhandbuch (in englischer Sprache) verfügbar.PyUNO-取り付け・設備
Seit OpenOffice 1.1 ist PyUNO in der Standardinstallation enthalten.PyUNO-Brücken-Modi
PyUNO kann in drei verschiedenen Modi benutzt werden:
- Innerhalb des OpenOffice.org-Prozesses mit dem Scripting-枠組み (nur OOo 2.0 und später!!),
- Innerhalb einer ausführbaren Pythondatei (und außerhalb des OOo-Prozesses)

Benutzen Sie diesen Modus, wenn Sie- beginnen, PyUNO zu benutzen (da dies die unmittelbarere Herangehensweise ist).
- das Ausführen eines Skriptes durch das Starten eines seperaten Prozesses auslösen wollen (z.B. ein CGI-Skript innerhalb eines HTTP-Servers).
- die kürzesten Umlaufzeiten wollen (Programmieren - Ausführen - Programmieren - Ausführen ...)
Hallo Welt
Stellen Sie sicher, dass OpenOffice.org nicht läuft (beachten Sie, dass Sie auf Windows auch den Schnellstarter im Systemabschnitt am rechten unteren ランド des Desktops beenden müssen). Starten Sie eine System-爆撃する ( cmd auf 勝利,勝つ NT/2000/XP, 命令(する) auf Win9x, tcsh or bash auf Unix). Wechseln Sie in das OpenOffice.org-Programmverzeichnis (z.B. C:\Programe\OpenOffice.org1.1\program ) und starten Sie das Office mit den folgenden Kommandozeilenparametern
c:\Programe\OpenOffice1.1\program> soffice "-受託する=socket,host=localhost,port=2002;urp;"
落ちるs OpenOffice.org nicht mit einem leeren Textdokument gestartet ist, wählen Sie im Menü Datei - Neu - Textdokument aus.
Benutzen Sie 修道女 Ihren Lieblingstexteditor, um das folgende Beispielprogramm hello_world.py zu erstellen:
輸入する uno # Die UNO-Komponente Kontext (状況) 出身の der PyUNO-Laufzeitumgebunt holen localContext = uno.getComponentContext() # Die UnoUrlResolver erstellen resolver = localContext.ServiceManager.createInstanceWithContext( "com.sun.星/主役にする.橋(渡しをする).UnoUrlResolver", localContext ) # Zum laufenden Office verbinden ctx = resolver.解決する( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" ) smgr = ctx.ServiceManager # Das zentrale Desktop-Objekt holen desktop = smgr.createInstanceWithContext( "com.sun.星/主役にする.でっちあげる,人を罪に陥れる.Desktop",ctx) # auf das aktuelle Writer-Dokument zugreifen model = desktop.getCurrentComponent() # auf die Eigenschaften des aktuellen Dokuments zugreifen text = model.Text # Schreibmarke (Cursor) erstellen cursor = text.createTextCursor() # Text in das Dokument einfügen text.insertString( cursor, "Hello World", 0 ) # Tun Sie eine unangenehme Sache, bevor Sie den Python-Prozess verlassen. 落ちるs der # letzte Aufruf ein einseitiger Aufruf ist (sehen sie z.B. die idl-spec 出身の insertString), # muss es aus dem (武器などの)隠匿場所 der Remote-Brücke herausgepresst werden, bevor Pyhton # den Prozess beendet. Andernfalls wird der einseitige Aufruf das Zielobjekt erreichen oder auch nicht. # Ich erledige dies hier mit einem billigen gleichzeitigen Aufruf (getPropertyValue). ctx.ServiceManager
Starten Sie 修道女 das obige Skript mit dem Python-Skript, das sich im Programmverzeichnis (出身の OpenOffice.org) befindet
公式文書,認める: Sie müssen die Skript-/(製品,工事材料の)一回分(BAT)-Datei im Programmverzeichnis benutzen, um Python zu starten. Das einfache Starten der ausführbaren Python-Datei im Verzeichnis der Laufzeitumgebung (oder dasjenige aus der Python-取り付け・設備 irgendwo auf Ihrer Maschine) funktioniert nicht.c:\Programme\OpenOffice1.1\program> .\python hello_world.py
Dieses Skript schreibt "Hello World" in das aktuelle Writer-Dokument.
Innerhalb des OpenOffice.org-Prozesses

Benutzen Sie diesen Modus, wenn- Sie Ihren Programmcode leicht auf verschiedene andere Maschinen ausrollen wollen (unter Benutzen 出身の UNO-Paketen)
- Ihre Skripte 出身の UI-Ereignissen (UI=使用者 Interface / Benutzerschnittstelle, Menü oder Symbolleisten) ausgelöst werden sollen
- Sie etwas Erfahrung mit PyUNO gesammelt haben
- Sie Ihre Skripte mit der besten 業績/成果 laufen lassen wollen
Hallo Welt
Das obige Hallo-Welt-Beispiel ist 修道女 neu programmiert als UNO-Komponente, was bedeutet, dass der Programmcode, der das Einfügen erledigt, in eine Python-Klasse eingebettet werden muss. Zusätzlich muss der Programmcode für das Verbinden zum Office-Programmcode ersetzt werden durch einen eindeutigen Einsprungpunkt, der vom Python-Ladeprogramm benutzt wird, um die Python-Klasse zu instanzieren.hello_world_comp.py:輸入する uno 輸入する unohelper from com.sun.星/主役にする.仕事 輸入する XJobExecutor # Implementieren einer UNO-Komponente mittels Ableitens aus der Standardklasse unohelper.Base # und 出身の der(den) Schnittstelle(n), die Sie implementieren wollen. class HelloWorldJob( unohelper.Base, XJobExecutor ): def __init__( self, ctx ): # Den Komponentenkontext für spätere Benutzung speichern self.ctx = ctx def 誘発する/引き起こす( self, args ): # Hinweis: args[0] == "HelloWorld", siehe unten die Konfigurationseinstellungen # Abrufen des Desktop-Objekts desktop = self.ctx.ServiceManager.createInstanceWithContext( "com.sun.星/主役にする.でっちあげる,人を罪に陥れる.Desktop", self.ctx ) # Das aktuelle Dokumentenmodell holen. model = desktop.getCurrentComponent() # auf die Eigenschaften des Textdokuments zugreifen text = model.Text # Schreibmarke (Cursor) erstellen. cursor = text.createTextCursor() # Den Text in das Dokument einfügen. text.insertString( cursor, "Hello World", 0 ) # pythonloader schaut nach einer statischen Variable g_ImplementationHelper g_ImplementationHelper = unohelper.ImplementationHelper() # g_ImplementationHelper.addImplementation( \ HelloWorldJob, # UNO-Objekt-Klasse "org.openoffice.comp.pyuno.デモ.HelloWorld", # implementationsname # Ändern Sie diesen Namen für Ihr eigenes # Skript ("com.sun.星/主役にする.仕事.職業",),) # 名簿(に載せる)/表(にあげる) 出身の implementierten Diensten (services) # (der einzige Dienst)Der Programmcode muss mit einem Benutzerereignis verbunden werden. Dies kann kann z.B. mit den folgenden Konfigurationseinstellungen erledigt werden:
Addons.xcu:<?xml 見解/翻訳/版="1.0" encoding="UTF-8"?> <oor:node xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:指名する="Addons" oor:一括="org.openoffice.Office"> <node oor:指名する="AddonUI"> <node oor:指名する="AddonMenu"> <node oor:指名する="org.openoffice.comp.pyuno.デモ.HelloWorld" oor:op="取って代わる"> <支え(る) oor:指名する="URL" oor:type="xs:string"> <value>service:org.openoffice.comp.pyuno.デモ.HelloWorld?挿入する</value> </支え(る)> <支え(る) oor:指名する="ImageIdentifier" oor:type="xs:string"> <value>私的な:image/3216</value> </支え(る)> <支え(る) oor:指名する="肩書を与える" oor:type="xs:string"> <value xml:lang="en-US">挿入する Hello World</value> </支え(る)> </node> </node> </node> </oor:node>Beide Dateien müssen in ein einzelnes Zip-Archiv unter Verwenden Ihres Lieblings-Zip-Programmwerkzeuges, z.B. Infozip, gepackt werden.
zip hello_world.zip Addons.xcu hello_world_comp.py 追加するing: Addons.xcu (deflated 55%) 追加するing: hello_world_comp.py (deflated 55%)
Dieses Paket kann dann in einer OpenOffice.org-取り付け・設備 unter Benutzen des Werkzeugs
pkgchk, das sich im OOo-Programmverzeichnis befindet, eingesetzt werden. Beachten Sie, dass das Office gestoppt worden sein muss, bevor das Paket installiert wird.Hinweis: Stellen Sie sicher, dass die Umgebungsvariable PYTHONPATH nicht gesetzt ist, wenn Sie pkgchk oder soffice starten (sehen Sie #i17339#). Dies mag es erfordern, dass Sie eine (製品,工事材料の)一回分-Datei (BAT) für soffice auf Windows erstellen, in der PYTHONPATH in der Systemkonfiguration auf Null gesetzt wird oder soffice immer aus einer Konsole mit dem Setzen 出身の PYTHONPATH= (Windows) oder unsetenv PYTHONPATH (Unix tcsh 爆撃する) gestartet wird.
c:\Program とじ込み/提出するs\OpenOffice.org1.1\program> pkgchk hello_world.zip c:\Program とじ込み/提出するs\OpenOffice.org1.1\program>
Bei Erfolg erfolgt keine Ausgabe durch das Werkzeug. Wenn OpenOffice.org startet, gibt es einen neuen Eintrag im Menü (sehen Sie
道具s/付加 構成要素s/挿入する Hello World).
Mehr Beispiele
ooextract.py
Ein Kommandozeilenwerkzeug, das den Text, HTML- oder PDF-Inhalte aus einem Writer-Dokument auswählt und dies in eine andere Datei oder (optional) auf der Standardausgabe (stdout) ausgibt (Durchsuchen / grepen sie Ihre Office-Dokumente).oomerge.py
Ein Kommandozeilenwerkzeug, das ein neues Dokument erstellt durch das Anhängen 出身の mehreren Einzeldokumenten.swriter.py
Ein Kommandozeilenprogramm, das ein Writer-Dokument mit etwas Text und Tabellen füllt.- swritercomp.py,
swritercompclient.py
Dasselbe wie oben, aber implementiert als Python-UNO-Komponente, so dass es innerhalb des Office-Prozesses läuft. Dies zeigt die 業績/成果-Vorteile, Skripte zu haben, die innerhalb eines Prozesses laufen.Sie müssen das Programm swritercomp.py mit dem Werkzeug pkgchk (siehe unten) zur Office-取り付け・設備 hinzufügen und können dann das Programm swritercomp_client.py benutzen, um es auszuführen.
biblioaccess.py
Ein Kommandozeilenprogramm, das den Inhalt der Bibliotheksbeispieldatenbank anzeigt, die mit OpenOffice.org mitgeliefert wird.- Ihre Beispiele (Bitte senden Sie mehr Beispiele ein, so dass sie hier hinzugefügt werden können).
UNO-Sprach-Bindung
Im Folgenden finden Sie eine komplette Beschreibung dazu, wie UNO-Funktionen auf die Python-Programmsprache abgebildet sind.UNO-Typen-Abbildung
| IDL-Datentyp | Darstellung in Python | |||
|---|---|---|---|---|
| integer types (byte, short, unsigned short, long, unsigned long, hyper, unsigned hyper |
Python kennt 抑留する nur die C-Datentypen long und long long als Integertypen.
Auf den meisten Maschinen ist ein long ein 32-Bit-Wert während long long ein 64-Bit-Wert ist.
|
|||
| boolean | Python hat 抑留する einen Datentyp Boolean, der abgeleitet ist vom Integer-Typ (siehe
http://python.org/peps/pep-0285.html ).
Es existieren die Singletons True und 誤った,
welche PyUNO benutzt, um zwischen Integern- und Bool-Werten zu
unterscheiden.
Solange ein Bolean in der Schnittstellen-Methoden-Signatur spezifiziert ist, können Sie ebenso Integerwerte benutzen. In dem folgenden Beispiel sind alle Aufrufe gültig:
Wenn Sie allerdings ausdrücklich ein Boolean durchlaufen lassen wollen, wo nur irgendeiner spezifiziert ist, müssen Sie
Hinweis: Es existiert außerdem die Klasse uno.Bool, die seit PyUNO 0.9.2 nicht ausgeführt wurde, aber noch immer unterstützt wird. Benutzen Sie diese nicht mehr. | |||
| string | Im allgemeinen wird der String in einem Python-Unicode-String abgebildet. Allerdings können Sie auch dort einen 8-Bit-Python-String benutzen, wo ein UNO-String erwartet wird. Die Brücke konvertiert den 8-Bit-String in einen Unicode-String unter Anwendung des System-地元の.
|
|||
| char |
Ein char wird in einem
|
|||
| enum | Ein konkreter Enum-Wert wird durch eine Instanz der Klasse uno.Enum repräsentiert. Sie hat zwei Elemente: typeName ist ein String, der den Namen des Enum-Typs enthölt, und
value, das den Wert 出身の Enum enthölt.
Sie können Enum-Werte auf zwei Wegen erzeugen:
|
|||
| type | Ein Type wird in einen uno.Type abgebildet. Es hat öffentliche Elemente typeName (string) und
typeClass (Enum-Wert 出身の com.sun.星/主役にする.uno.TypeClass).
Es existiert eine Funktion uno.getTypeByName(), um einfach eine Type-Instanz zu erstellen. Die Funktion endet in einer RuntimeException (Laufzeitfehler), 落ちるs der Type unbekannt ist.
Sie können konkrete Type-Werte auf zwei Wegen erzeugen:
|
|||
| struct (und exception) |
Für jedes UNO-Struct (oder exception), wird während der Übertragung eine neue Python-Klasse erzeugt. Es ist garantiert, dass es nur eine Instanz des Struct-(oder exception)Klasse プロの/賛成の Python-Interpreter-Instanz gibt. Die erzeugte Klasse spiegelt die Vererbungshierarchie des konkreten UNO-Type wieder (zum Beispiel wichtig für die Behandlung 出身の exceptions/Ausnahmen; siehe unten).
Man kann eine Struct-Klasse unter Verwendung des Importmechanismus erzeugen. Eine Instanz eines Struct kann dann unter Verwendung des Python-建設者 instanziert werden. Der 建設者 unterstützt O-Argumente (無 arguments) (Elemente werden mit 基準s konstruiert): 1 argument which the same type (copy 建設者), and n arguments, where n is the number of elements of the 固める/コンクリート struct. The struct supports the equality 操作者, two structs are equal, if they are of the same type and each member is equal. Beispiel:
uno.createUnoStruct() und der 指名する des Struct als erster Parameter und optional Konstruktionsargumente übergeben werden (sehen Sie oben nach einem Beispiel der möglichen ctors).
Achtung: In UNO haben Structs structs have value semantic, allerdings spiegelt die Behandlung in Python dies nicht wieder. Wenn ein Struct an eine Funktion übergeben wird, wird der Wert an den Angerufenen übergeben. Spätere Veränderungen der Struct-Instanz beeinflussen den Angerufenen nicht mehr. Allerdings das einfache Zuweisen eines Struct zu einer anderen lokalen Variable erzeugt keine Kopie, sondern erzeugt einfach eine Parallelbezeichnung (偽名,通称) der ursprünglichen Instanz.
|
|||
| sequence | Eine Sequence wird im allgemeinen in einem Python-Tuple abgebildet. Eine Python-名簿(に載せる)/表(にあげる) wird nicht (!) akzeptiert.
Vorsicht (seit 0.9.2): Die IDL
|
|||
| constants | Ein UNO-IDL constant kann auf den folgenden Wegen vorgegeben werden:
|
|||
| any | Im allgemeinen kommt der Python-Programmierer nicht in
Berührung mit Any-Typen. Überall,
wo Any-Typen in der Methodensignatur erscheinen, kann der Python-Programmierer einfach einen
固める/コンクリート-Wert übergeben. Folglich enthalten Rückgabewerte oder
Out-Parameter auch niemals ein konkretes Any.
Allerdings gibt es bestimmte Fälle, in denen ein Python-Programmierer eventuell einen bestimmten Werttyp an einen Aufrufer übergeben will (Hinweis: dies ist nur möglich für '橋(渡しをする)d'-Aufrufe; sie können ein typisiertes Any nicht an ein anderes Python-UNO-反対する übergeben). Sie können ein
Diese Anys können nur in Verbindung mit dem
sequence<short>.
Wenn obj ein lokales Python-Objekt ist, erhält es einfach den (4,5), wie es ihn mit einem normalen Aufruf
bekommen hätte.
HINWEIS: Es gibt aktuell einen Fehler in PyUNO (sehen Sie #i31159#), der es nicht ermöglicht, anys in structs einzufüllen (z.B. ein PropertyValue struct enthält ein any). Sie können eine provisorische Lösung hierfür mit dem folgenden Programmierbeispiel erstellen:
before(com.sun.星/主役にする.beans.PropertyValue){ 指名する = (string)"TabStopPosition", 扱う = (long)0x0, Value = (any){ (byte)0x64 }, 明言する/公表する = (com.sun.星/主役にする.beans.PropertyState)DIRECT_VALUE } after(com.sun.星/主役にする.beans.PropertyValue){ 指名する = (string)"TabStopPosition", 扱う = (long)0x0, Value = (any){ (long)0x64 }, 明言する/公表する = (com.sun.星/主役にする.beans.PropertyState)DIRECT_VALUE } |
Implementieren 出身の UNO-Objekten
Man kann Python-Klassen benutzen, um ein UNO-Objekt zu implementieren. Instanzen einer Python-Klasse können dann als Argument an einen UNO-Aufruf übergeben werden, wo Any- oder 固める/コンクリート-Schnittstellen vorgegeben werden.Um ein UNO-Objekt zu sein, MUSS eine Python-Klasse die Schnittstelle com.sun.星/主役にする.lang.XTypeProvider implementieren durch Implementieren der zwei Methoden getTypes() und getImplementationId(), die die Python-Brücke informieren, welche konkreten UNO-Schnittstellen die Python-Klasse implementiert. Die Funktion getTypes() definiert, welche Schnittstelle in der Klasse implementiert ist.
Um dies einfacher zu machen, gibt es eine Klasse unohelper.Base, wovon
ein Python-UNO-Objekt abgeleitet sein sollte. Sie können dann eine UNO-Schnittstelle einfach durch Ableiten 出身の der gewünschten Schnittstelle ableiten. Das folgende Beispiel implementiert einen com.sun.星/主役にする.io.XOutputStream, der alle in das Stream geschriebenen Daten in einer ByteSequence speichert. (Beachten Sie, dass dies eine schwache 実施 ist, die einfach für Demonstrationszwecke erfolgt.).
輸入する unohelper
from com.sun.星/主役にする.io 輸入する XOutputStream
class SequenceOutputStream( unohelper.Base, XOutputStream ):
def __init__( self ):
self.s = uno.ByteSequence("")
self.の近くにd = 0
def closeOutput(self):
self.の近くにd = 1
def writeBytes( self, seq ):
self.s = self.s + seq
def 紅潮/摘発する( self ):
pass
def getSequence( self ):
return self.s
|
Implementieren 出身の Python-UNO-Komponenten
Es gibt ein Ladeprogramm für Python-Komponenten. Es erlaubt, Instanzen 出身の Python-Klassen nicht nur innerhalb des Python-Prozesses, sondern in jedem beliebigem UNO-Prozess einschließlich OpenOffice.org zu erstellen. Das Python-Ladeprogramm läd die Python-Laufzeitumgebung auf Anforderung, 落ちるs sie nicht bereit geladen ist, führt Python-Programmcode innerhalb des Haupt-Python-Interpreters aus.
落ちるs der Leser mit dem Komponenten-Registrierungsprozess nicht vertraut ist, sollte er das OpenOffice.org-Entwickler-Handbuch für eine umfassende Erläuterung konsultieren.
Das Python-Ladeprogramm unterstützt aktuell die folgenden Protokolle für eingehende URLs:
| Protokollname | Beschreibung |
|---|---|
| vnd.openoffice.pymodule | Der Protokoll abhängige Teil wird interpretiert als ein Python-Modulname,
der unter Verwendung des gewöhnlichen Python-Importmechanismus
(der die Umgebungsvariable PYTHONPATH benutzt) importiert worden ist.
Beispiel: Das vorgegebene Modul wird zu der Hashmap |
| とじ込み/提出する | Eine zwingend 絶対の Datei-URL zu einer Python-Komponentendatei.
Die Datei selbst muss nicht im PYTHONPATH enthalten sein, allerdings kann es nur Dateien importieren,
die im PYTHONPATH enthalten sind.
Das Modul ist nicht hinzugefügt zu sys.modules.
Beispiel: |
| vnd.sun.星/主役にする.拡大する | Das Python-Ladeprogramm unterstützt den gewöhnlichen Makro-Expansionsmechanismus, wie die Java- oder C++-Ladeprogramme es tun.
Beispiel: |
Nachdem die Module importiert worden sind, schaut das Python-Ladeprogramm nach einer modul-globalen Variable mit dem Namen g_ImplementationHelper aus, die als Instanz 出身の unohelper.ImplementationHelper erwartet wird.
Der folgende Beispielcode erstellt eine UNO-Komponente aus dem obigen UNO-Objekt
(beachten Sie, dass die Komponente nicht brauchbar ist, da es keine UNO-Methode gibt, um das Tuple abzurufen, und auch keine Dienstspezifikation 出身の com.sun.星/主役にする.io.OutputStream gibt. Es ist hier einfach ein Beispiel.)
輸入する unohelper
from com.sun.星/主役にする.io 輸入する XOutputStream
g_ImplementationHelper = unohelper.ImplementationHelper()
class TupleOutputStream( unohelper.Base, XOutputStream ):
# The 構成要素 must have a ctor with the 構成要素 状況 as argument.
def __init__( self, ctx ):
self.t = ()
self.の近くにd = 0
# idl 無効の closeOutput();
def closeOutput(self):
self.の近くにd = 1
# idl 無効の writeBytes( [in] sequence<byte>seq );
def writeBytes( self, seq ):
self.t = self.t + seq # 簡単に 追加する the 後継の tuple to the member
# idl 無効の 紅潮/摘発する();
def 紅潮/摘発する( self ):
pass
# convenience 機能(する)/行事 to retrieve the tuple later (no UNO 機能(する)/行事, may
# only be called from python )
def getTuple( self ):
return self.t
# 追加する the TupleOutputStream class to the 実施 コンテナ,
# which the loader uses to 登録(する)/instantiate the 構成要素.
g_ImplementationHelper.addImplementation( \
TupleOutputStream,"org.openoffice.pyuno.PythonOutputStream",
("com.sun.星/主役にする.io.OutputStream",),)
|
regcomp -登録(する) -br types.rdb -br services.rdb -r services.rdb -c vnd.openoffice.pymodule:tuplestrm
Sie können natürlich auch das Werkzeug pkgchk benutzen, wie dies in dem Tuturial-Abschnitt erklärt ist, mit
pkgchk tuplestrm.py .
Beachten Sie allerdings, dass dieses Kommando eine Kopie der Datei erstellt (落ちるs das Skript sich ändert, muss es unter Verwenden des obigen Kommandos neu eingesetzt werden).
Die Komponente kann auch 出身の OpenOffice.org Basic mit
tupleStrm = createUnoService( "com.sun.星/主役にする.io.OutputStream" ) tupleStrm.紅潮/摘発する() |
instanziert werden.
Out-Parameter-Behandlung
UNO-Out-Parameter werden durch das Python-Mehrfachrückgabewertfähigkeit behandelt. Für reine Out-Parameter sollte ein 模造の-Wert 非,不,無
als Platzhalter benutzt werden. Dies ist am besten mit einem Beispiel erläutert.
Lassen Sie uns annehmen, wir haben die folgende IDL-Methoden-Spezifizierung
long foo( [in] long first, [inout] long second, [out] third ) |
Ein Python-UNO-Objekt implementiert solch eine Methode auf dem folgenden Weg:
class 模造の( XFoo ):
def foo( self, first,second,third):
# 公式文書,認める: the value of third is always 非,不,無, but it must be there
# as a placeholder if more args would follow !
return first,2*second,second + first
|
ret,second,third = unoObject.foo( 2, 5 , 非,不,無 ) print ret,second,third # results into 2,10,7 |
Dies unterstreicht auch, dass Out-Parameter ziemlich nahe an Mehrfachrückgabewerten (dabei geht die semantische Assoziierung eines Inout-Parameters verloren).
Beachten Sie jedoch, dass
- Sie die korrekte Anzahl der Rückgabewerte sowohl im Aufruf wie im implementierenden
Programmcode haben müssen, andernfalls erhalten Sie eine
RuntimeExceptionwährend des Aufrufs. - eine 無効の-Methode gibt immer ein
非,不,無zurück, gefolgt 出身の möglichen Out-Parametern, weshalb Sie, wenn Sie eine 無効の-Methode mit einem Out-Parameter haben, die Ausgabe zwei Variablen zuweisen müssen (dabei wird die erste immer 非,不,無 sein). - ein Python-Objekt, das eine 無効の-Methode mit Out-Parametern implementiert, MUSS immer
非,不,無als ersten Parameter zurückgeben.
Ausnahmen-Behandlung
Die Python-UNO-Brücke benutzt die gewähnlichen Python-Mechanismen für die Ausnahmenbehandlung. Für jede UNO-Ausnahme wird eine konkrete Ausnahmen-Klasse während der Ausführung erzeugt (siehe Tabelle oben zur Typ-Abbildung für eine Erklärung wie dies gemacht wird).Beispiel für das Abfangen
from com.sun.星/主役にする.uno 輸入する RuntimeException
from com.sun.星/主役にする.lang 輸入する IllegalArgumentException
from com.sun.星/主役にする.関係 輸入する NoConnectException
try:
uuresoler.解決する( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
except NoConnectException e:
print "The OpenOffice.org 過程 is not started or does not listen on the 資源 ("+e.Message+")"
except IllegalArgumentException e:
print "The url is 無効の ( "+ e.Message+ ")"
except RuntimeException e:
print "An unknown error occurred: " + e.Message
|
Beispiel für das Auswerfen
from com.sun.星/主役にする.io 輸入する IOException
class TupleOutputStream(XOutputStream,unohelper.Base):
def writeBytes( self, seq ):
if self.の近くにd:
raise IOException( "生産(高) stream already の近くにd", self )
self.t = self.t + seq
|
Unterstützung für aktuellen Kontext
NEU SEIT OOo 2.0.2PyUNO unterstützt das UNO-Aktueller-Kontext-Konzept. Es existieren die Funktionen uno.getCurrentContext() und uno.setCurrentContext( newContext ).
Ferner gibt es eine Klasse unohelper.CurrentContext. Der Konstruktor akzeptiert eine Hashmap mit Namen-/Werte-Paaren und dem ersteren Kontext für die Übertragung 召集(する) für die Verwendung:
oldContext = uno.getCurrentContext()
try:
uno.setCurrentContext(
unohelper.CurrentContext( oldContext,{"My42":42}) )
# ... do some uno calls, which may 解釈する/通訳する the "My42"
finally:
uno.setCurrentContext( oldContext )
|
UNOHelper-Modul
Das Modul unohelper.py enthält einige zusätzliche Funktionen/Klassen, die einfach mit PyUNO zu benutzen sind, jedoch nicht zwingend. Dieser Abschnitt listet einige der Funktionen 出身の unohelper.py auf.
def systemPathToFileUrl( systemPath )
|
Gibt eine Datei-URL für einen gegebenen Systempfad zurück. Die meisten der OOo-API-Funktionen erwarten eine Datei-URL, während die Python-Laufzeitumgebungsfunktionen im allgemeinen nur mit Systempfaden arbeiten. Die Funktion wurde unter Verwendung der Kern-C-Funktion
osl_getFileUrlFromSystemPath() implemeniert.
|
def fileUrlToSystemPath( url ) |
Gibt einen Systempfad zurück (bestimmt vom System, auf dem der Python-Interpreter läuft). Die meisten OOo-Funktionen geben eine Datei-URL zurück, während die meisten Python-Laufzeitumgebungs-Funktionen einen System-Pfad erwarten. Die Funktion ist unter Verwenden der Kernfunktion osl_getSystemPathFromFileUrl() implementiert worden.
|
def absolutize( path, relativeUrl )
|
Gibt eine 絶対の Datei-URL 出身の einer gegebenen zwingend absoluten Verzeichnis-URL und einer relativen Datei-URL zurück, die absolut oder relativ (was einschließt z.B. ../ Teile). Die Funktion wurde unter Verwendung der Kernfunktion osl_getAbsolutePathFromFileUrl() implementiert.
|
| def addComponentsToContext( toBeExtendedContext, contextRuntime, componentUrls, loaderName ) |
Diese Funktionen fügen ein Tuple 出身の Komponenten-URLs zu dem
toBeExtendedContext hinzu unter Verwenden des contextRuntime, um das Ladeprogramm loaderName und einige andere Dienste zu instanziieren, die für diese Aufgabe benötigt werden. Nach Vervollständigen der Funktion können alle Dienste innerhalb diese Komponenten instanziiert werden, solange wie der toBeExtendedContext nicht bereit ist. Die Änderungen sind nicht dauerhaft vorgenommen.
|
def 検査/視察する( unoobject, とじ込み/提出する )
|
Gibt die Typinformation zu einem gegebenes UNO-Objekt in eine Datei aus (tatsächlich muss die Datei eine Instanz einer Klasse sein, die eine Schreib-Methode implementiert). Die Typinformation schließt den Implementationsnamen, unterstützte Dienste, unterstützte Schnittstellen, unterstützte Methoden und unterstützte Eigenschaften ein. |
Protokollierung
NEU SEIT OOo 2.0.2Die PyUNO-Brücke kann 修道女 jeden Aufruf protokollieren, der über die Brücke zwischen Python und UNO läuft. Dies kann eine nützliche Hilfe sein, wenn Sie Ihren Programmcode debuggen oder profilieren müssen. Es gibt zwei Umgebungsvariablen, die die Protokollierung aktivieren:
| PYUNO_LOGLEVEL |
Gültige Werte sind
|
| PYUNO_LOGTARGET |
|
Abhängigkeiten
Dieser Abschnitt ist interessant für alle, die die PyUNO-Brücke unabhängig 出身の OpenOffice.org benutzen wollen.
Im Unterschied zu der Java- oder C++-UNO-Bindung ist die Python-UNO-Bindung nicht vollständig. Sie benötigt die C++-Bindung und ergänzende Skript-Komponenten. Diese ergänzenden Komponenten befinden sich aktuell in den gemeinsam benutzten Bibliotheken typeconverter.uno, invocation.uno, corereflection.uno, introspection.uno, invocadapt.uno, proxyfac.uno, pythonloader.uno (auf Windows typeconverter.uno.dll,...; unix typeconverter.uno.so,...).
Oft werden auch die Komponenten für das Herstellen einer Interprozessverbindung benötigt. Dies sind die gemeinsam genutzten Bibliotheken uuresolver.uno, connector.uno, remotebridge.uno, bridgefac.uno.
Die Pfadumgebungsvariablen (LD_LIBRARY_PATH auf Unix, PATH auf Windows) müssen auf das Verzeichnis zeigen, wo die UNO-Kernbibliotheken, die oben aufgelisteten Komponenten und gemeinsam genutzten Bibliotheken 出身の PyUNO gespeichert sind. (Auf Unix existieren zwei Dateien: libpyuno.so enthält den Programmcode und eine pyuno.so, die für den 輸入する der systemeigenen Python-Module benötigt wird). Zusätzlich müssen die Python-Module uno.py, unohelper.py und pythonloader.py in einem Verzeichnis gespeichert sein, das in der Umgebungsvariable PYTHONPATH aufgelistet ist.
Bootstrappen 出身の PyUNO 出身の der ausführbaren Pythondatei
Wenn das UNO-Modul das erste Mal 出身の einem beliebigen Python-Skript importiert wird, muss es einen richtig preparierten UNO-Komponenten-Kontext bootstappen. When the uno module gets first 輸入するd from an 独断的な python script, it must bootstrap a 適切に 用意が出来ている UNO 構成要素 状況.
# bootstraps the uno 構成要素 状況 輸入する uno # retrieve the already bootstrapped 構成要素 状況 unoContext = uno.getComponentContext() |
Da der Python-Programmierer nicht Parameter eingeben kann (und will), während ein Modul importiert wird, benutzt die Python-UNO-Bindung die Datei pyuno[rc|.ini], gespeichert neben der 出身の PyUNO gemeinsam genutzten Bibliothek, um den UNO-Kontext zu bootstrappen (sehen Sie hierzu UNO-Bootstrap-Variablen-Konzept). Die Bootstrap-Variablen UNO_SERVICES muss auf eine Registry-Datei zeigen, in der die oben angegebenen Komponenten registriert wurden.
PYUNOLIBDIR ist eine besondere Bootstrap-Variable, die den Pfad zu den aktuell verwendeten gemeinsam genutzten Bibliotheken 出身の PyUNO enthä. Beispiel:
# The bootstrap variable PYUNOLIBDIR will be 始める,決める by the pyuno runtime library UNO_TYPES=$PYUNOLIBDIR/types.rdb UNO_SERVICES=$PYUNOLIBDIR/pyuno_services.rdb |
Wenn die obigen Voraussetzungen erfüllt sind, kann das Skript einfach gestartet werden mit
$ python myscript.py
Manchmal ist es vorzuziehen, die Bibliotheksnamen der verlangten Komponenten direkt in dem Skript aufzuführen, anstatt eine Registry zu präparieren
(beachten Sie jedoch, dass die oben erwähnten Bootstrap-Komponenten immer in der Registry registriert werden müssen).
Dies kann erreicht werden durch das Verwenden der Funktion
unohelper.addComponentsToContext(
toBeExtendedContext, contextRuntime, componentUrls, loaderName )
Beispiel:
輸入する uno
輸入する unohelper
localContext = uno.getComponentContext()
unohelper.addComponentsToContext(
localContext, localContext, ("streams.uno",),
"com.sun.星/主役にする.loader.SharedLibrary")
麻薬を吸う = localContext.ServiceManager.createInstanceWithContext(
"com.sun.星/主役にする.io.麻薬を吸う", localContext )
麻薬を吸う.writeBytes( uno.ByteSequence( "abc" ) )
ret,seq = 麻薬を吸う.readBytes( 非,不,無, 3 )
|
Ersetzen der Python-Laufzeitumgebung durch diejenige Ihrer systemeigenen Pythoninstallation
OOo bringt standardmäßig die Python-2.2.2-Kernlaufzeitumgebung mit. Dies ist fein für die meisten Benutzer, aber einige Hacker (oder Linux-Distributoren) wollen eventuell die Laufzeitumgebung durch diejenige der systemeigenen Pythoninstallation ersetzen, welche eventuell mehr optionale Pakete enthölt, die sie in Python benutzen wollen.Das Ersetzen ist ein wenig kompliziert, allerdings benötigen sie nur ein installiertes Python und Office.
Windows
Auf Windows können Sie nur Python-2.2 benutzen. 落ちるs Sie Python-2.3 verwenden wollen, müssen Sie das PyUNO-Modul mit Python-2.3 neu kompilieren (sehen Sie unten).
- Installieren Sie OpenOffice.org
- Installieren Sie Python-2.2
- Benutzen Sie Ihren Lieblingstexteditor (z.B. Notepad), um die Datei
OpenOffice.org/program/pythonloader.uno.ini zu öffenen und verändern Sie die Zeilen dort zu etwas wie
[Bootstrap] PYTHONHOME=とじ込み/提出する:///c:/python-2.3.4 PYTHONPATH=$PYTHONHOME/lib $ORIGIN
Die Pfadelemente müssen als 絶対の Datei-URLs eingegeben werden (Beachten Sie, dass Sie URL-Escape-Sequenzen benutzen müssen, z.B. ersetzen Sie Leerfelder mit einem %20). PYTHONPATH muss auf die Wurzel des Speicherplatzes der Python-Bibliothek und auf das OOo-Programm-Verzeichnis zeigen. Fügen Sie andere Bibliotheken, 落ちるs Sie diese benötigen, hinzu (getrennt durch ein Leerfeld). - Benennen Sie die folgenden Dateien und Verzeichnisse im Verzeichnis OpenOffice.org/program directory
irgendwie um (z.B. fügen Sie eine Nachsilbe .orig an)
- python.bat
- python22.dll
- python-核心-2.2.2
- Starten Sie eine Konsole cmd und fügen Sie der Pfad-Variablen beides hinzu, zum Python-Heimatverzeichnis und zum Verzeichnis 出身の OpenOffice.org/program.
- Fügen Sie der Umgebungsvariablen PYTHONPATH das Verzeichnis OpenOffice.org/program hinzu.
Linux
Auf Linux können Sie beides benutzen, Python-2.2 oder Python-2.3, aber 落ちるs Sie das letztere benutzen, erhalten Sie eine Warnung auf stderr (die Sie über die Versionsunverträglichkeit informiert), wenn Sie Python oder das Office starten. Um die Warnung zu vermeiden, müssen Sie PyUNO mit Python-2.3 neu erstellen (sehen Sie unten). Allerdings habe ich wegen der Versionsunverträglichkeit einige Schwierigkeiten festgestellt.
- Sie brauchen ein mit der 選択 --enable-株d konfiguriertes Python. 落ちるs OOo und Python nicht mit demselben gcc-Kompiler erstellt worden sind, müssen Sie außerdem Python neu erstellen, da das 基準-Python einige ungünstige Schalter während des Verlinkens benutzt.
Um es neu zu erstellen tun Sie
LINKCC=gcc 輸出(する) LINKCC ./configure --enable-株d make su -c "make 任命する/導入する"
- Wechseln Sie in das OpenOffice.org-Verzeichnis und verschieben Sie die Python-Laufzeitumgebung, die mit OOo ausgeliefert wird.
cd /path/to/openoffice.org/program mv libpython.so.2 libpython.so.2.orig mv python-核心 python-核心.orig cp pythonloader.unorc pythonloader.unorc.orig ln -s /usr/地元の/lib/libpython2.3.so.1.0 libpython.so.2
- Fügen Sie das Verzeichnis office/program zu den Variablen LD_LIBRARY_PATH und PYTHONPATH hinzu.
-
Erstellen Sie die Datei pythonloader.unorc in dem Verzeichnis office/program.
[Bootstrap] PYTHONHOME=とじ込み/提出する:///usr/地元の PYTHONPATH=$PYTHONHOME/lib/python2.3 $ORIGIN
Die Pfadelemente müssen als 絶対の Datei-URLs eingegeben werden (Beachten Sie, dass Sie URL-Escape-Sequenzen benutzen müssen, z.B. ersetzen Sie Leerfelder mit einem %20). PYTHONPATH muss auf die Wurzel des Speicherplatzes der Python-Bibliothek und auf das OOo-Programm-Verzeichnis zeigen. Fügen Sie andere Bibliotheken, 落ちるs Sie diese benötigen, hinzu (getrennt durch ein Leerfeld).
Testen
Sie sollten 修道女 in der Lage sein, das Python des Systems zu starten und '輸入する uno' einzutippen. 落ちるs dies schön funktioniert, benutzen Sie pkgchk, um Ihr Skript anzuwenden, z.B. das obige swritercomp.py in OpenOffice.org (Tipp: Fügen Sie ein print sys.見解/翻訳/版 hinzu). 落ちるs die schön funktioniert, sollte Python auch in OpenOffice.org selbt gut funktionieren.Ich habe nur einige elementare 実験(する) durchgeführt, jedoch habe ich keine erheblichen Probleme feststellen können. Lassen Sie uns wissen, 落ちるs Sie einige haben.
Beachten Sie, dass das Bibus-事業/計画(する) ein erweitertes Python 2.2.2 mit einer wxPyton-/wx-Windows-Erweiterung für die grafische Benutzerschnittstelle (GUI) benutzt.
Neubauen 出身の PyUNO
Sie müssen die OOo-Buildumgebung installieren, um dies zu tun. Ersetzen Sie in der 爆撃する die Variable PYTHONPATH richtig, z.B.setenv PYTHONPATH /usr/地元の/lib/python2.3:.:/usr/地元の/lib/python2.3/lib-dynloadStellen Sie sicher, dass das systemeigene Python in der Pfadvariable ist. Erstellen Sie das Office (oder zumindest alle Komponenten, 出身の denen PyUNO abhängt), aber lassen Sie die Python-Module weg. In den Python-Modulen selbst sollten Sie nur pyuno/source/module, pyuno/source/loader und pyuno/実験(する) erstellen. Lassen das Verzeichnis zipcore weg. Sie müssen die Dateien pyuno/source/module/makefile.mk und pyuno/source/loader/makefile.mk verändern. Ersetzen Sie die Zeile CFLAGS+= mit CFLAGS+=-I/usr/地元の/含む/python2.3 und alle Vorkommen 出身の -lpython mit -lpython2.3.
落ちるs der 実験(する) fein läuft, können Sie 修道女 pyuno.so, libpyuno.so und pythonloader.uno.so in dem Office durch Ihre neu erstellten 見解/翻訳/版 ersetzen.
Regressionstests
Sofern Sie Python oder PyUNO verändert haben, sollten Sie wenigstens den folgenden Regressiostest laufen lassen.- Testtool-Module bilden und laufen lassen
cd testtools/source/bridgetest/pyuno && dmake runtest
- Installationssets bilden und OpenOffice.org installieren.
- Starten Sie program/python und schreiben Sie
輸入する uno
(sollte ohne irgendwelche Fehler funktionieren). - Starten Sie das Office und fügen Sie das pyuno_hello_world.zip 出身の dem obigen pyuno-doc.zip unter Benutzen 出身の Extras - 拡張 経営者/支配人 hinzu.
- Starten Sie Extras - Makros - Makro ausführen - OpenOffice.org 大型のs - pythonSamples - TableSample - createTable
Externe Verweise
| Python-Homepage | http://www.python.org |
| Das OpenOffice.org-Komponentemodell | http://udk.openoffice.org |
| OpenOffice.org-Entwickler-Handbuch | http://api.openoffice.org/DevelopersGuide/DevelopersGuide.html |
Häufig gestellte Fragen (FAQ)
-
Warum bekomme ich den Fehler 'bus error', wenn ich das Skript hello-world auf Solaris starte?
Es scheint eine verfälschte 見解/翻訳/版 出身の libpyuno.so in dem Installationsset 出身の OpenOffice.org1.1.0 zu sein. Der Grund ist noch nicht klar, es mag entweder ein Fehler im PyUNO-Code oder ein Fehler beim Bauen sein. Bitte laden Sie libpyuno.so.gz herunter, um die OOo-1.1.0-見解/翻訳/版 damit zu patchen (wenden Sie diesen Patch nicht auf irgendeine andere 見解/翻訳/版 als OOo 1.1.0 für Solaris Sparc an!). -
Warum bekomme ich einen Fehler 'SystemError: pyuno runtime is not initialized, ...', wenn ich das Skript starte?
- PyUNO wurde nicht korrekt installiert (OO1.1RC2 und früher, repariert mit RC3). Bitte prüfen Sie
<openoffice-任命する/導入する>/program $ ls -c1d py*pyunorc pythonloader.py pythonloader.unorc python python.sh python-核心 python-核心-2.2.2 pythonloader.uno.so pyuno.soUnter bestimmten Umständen könnte es passieren, dass die folgenden ini-Dateien fehlen:pyunorc (or pyuno.ini on windows):
[Bootstrap] UNO_TYPES=$ORIGIN/types.rdb UNO_SERVICES=$ORIGIN/services.rdb
pythonloader.unorc (oder pythonloader.unorc auf Windows):
[Bootstrap] PYTHONHOME=$ORIGIN/python-核心 PYTHONPATH=$ORIGIN/python-核心/lib $ORIGIN/python-核心/lib/lib-dynload $ORIGIN
Schneiden Sie diese einfach aus und fügen Sie sie in einen Texteditor ein, um sie zu erstellen.
- Es wurden einige Fehler mit der obigen Fehlermeldung berichtet, die bisher noch nicht aufgelöst worden sind. Sie wollen eventuell dem #i17339# folgen.
- PyUNO wurde nicht korrekt installiert (OO1.1RC2 und früher, repariert mit RC3). Bitte prüfen Sie
-
Warum bekommen ich einen Fehler 'SystemError: _PyImport_FixupExtension: module pyuno not 負担d', wenn ich das Skript starte?
Dies passiert hauptsächlich, wenn Sie immer noch die System-Python-取り付け・設備 starten. OpenOffice.org bringt eine Python-取り付け・設備 mit (da Python und das Office mit der identischen Compiler-見解/翻訳/版 erstellt sein müssen). Bitte prüfen Sie dies mit 'which python'. Benutzen Sie einfach OpenOffice.org's Python mit dem absoluten Pfadnamen, zum Beispiel /usr/地元の/OpenOffice.org1.1/program/python meinskript.py. -
Warum bekomme ich einen Fehler "error: python-loader:'No module 指名するd pythonloader'", wenn ich pkgchk mit einer Python-Komponente laufen lasse?
Stellen Sie sicher, dass die Umgebungsvariablen PYTHONPATH und PYTHONHOME (die Sie eventuell gesetzt haben, da Sie eine anderes Python auf Ihrem System installiert haben) geleert worden sind, bevor soffice UND pkgchk gestartet werden. Dies ist eine provisorische Läsung. Wir denken gerade über eine bessere Lösung nach. -
Warum bekomme ich eine Fehlermeldung 'msvcr70.dll or python22.dll not 設立する', wenn ich Python starte?
Sie versuchen wahrscheinlich Python aus der exe und nicht mit der BAT-Stapeldatei zu starten, zum Beispiel:
(oder: Warum erhalte ich einen Fehler 'error while 負担ing 株d libraries: libstdc++.so.x' ? )
c:\Programme\OpenOffice.org1.1\program\python-runtime\貯蔵所\python.exe.
Allerdings müssen Sie benutzen: c:\Programme\OpenOffice.org1.1\program\python.bat. -
Warum erhalte ich 'PYTHONPATH=... is not an identifier', wenn ich Python starte?
Dies ist ein Fehler im dem Python-Skript, der mit älteren Bash-爆撃するs auftritt. Benutzen Sie einfach den Texteditor, um die folgenden Zeilen in dem Skript OOo-取り付け・設備/program/python.sh zu ändern
輸出(する) PYTHONPATH="$sd_prog":"$sd_prog/python-核心/lib":"$sd_prog/python-核心/lib/lib-dynload":"$PYTHONPATH" 輸出(する) PYTHONHOME="$sd_prog"/python-核心
zu
PYTHONPATH="$sd_prog":"$sd_prog/python-核心/lib":"$sd_prog/python-核心/lib/lib-dynload":"$PYTHONPATH" 輸出(する) PYTHONPATH PYTHONHOME="$sd_prog"/python-核心 輸出(する) PYTHONHOME
Dieser Fehler ist beseitigt mit OOo 1.1.1.
-
Ich habe auf meinem System bereits Python installiert. Warum bringt das Office ein anderes Python mit?
Python selbst wird 出身の OpenOffice.org mitgeliefert, da
- Python mit demselben C++-Kompiler wie das Office selbst auf allen Plattformen, die den gcc-Kompiler verwenden (z.B. Linux, BSD etc.) kompiliert worden sein muss.
- auf den meisten Unix-Plattformen keine gemeinsam genutzten (株d) Bibliotheken für Python standardmäßig verfügbar sind (obwohl einige Distributionen dies machen). Dies würde bedeuten, das Python-UNO-Komponenten nicht innerhalb des Office-Prozesses ausgeführt werden könnten.
- Python-Komponenten-Entwickler eine garantierte Mindestplattform benötigen, auf die sie sich verlassen können.
- Wiedererkennen einer Python-Laufzeitumgebung am Installationssystem eine extrem schwierige und zeitaufwändige Aufgabe wäre, wegen der existierenden vielen unterschiedlichen Python-Installationsschemen.
- Packetierer 出身の OpenOffice.org werden Ihre eigenen Pakete erstellen, zum Beispiel für Redhat oder Debian ohne Python. Die Standarddistribution muss auf Systemen aus dem unteren Bereich laufen.
-
Kann ich die System-Python-取り付け・設備 benutzen?
Sehen Sie hier. -
Warum lässt meine UNO-Komponente OpenOffice.org abstürzen, während die Beispiel-UNO-Komponente ausgezeichnet startet?
Es gibt einen bekannten Fehler im Office. Sehen Sie sich #i13377# an, der für OpenOffice.org 1.1 nicht behoben worden ist. Das Office stürzt gewöhnlich ab, wenn ein Python-Skript zu einer unbehandelten Ausnahme (zum Beispiel einem Attribut-Fehler) führt.Sie können versuchen eine provisorische Lösung für diesen Fehler zu finden, indem Sie ein
try: except:Level in Ihrer Umsetzung 出身の 誘発する/引き起こす() hinzufügen, das eine Fehlermeldung an stdout/stderr ausgibt. Allerdings hilft dies leider nicht in allen Föllen (zum Beispiel Fehler beim Kompilieren aus manchen Gründen; bitte folgen Sie dem 問題/発行する für weitere Informationen).Es mag andere Gründe für einen Absturz geben, die Sie nur erkennen werden, wenn Sie versuchen, einen systemeigenen Callstack abzurufen (zum Beispiel unter Verwenden des gdb).
Warum funktionieren bei mir der Python-XML-Parser (expat) oder das Zip-Modul nicht?
Diese Bibliotheken sind noch nicht in OOo 1.1 eingebaut. Dies wird sich mit OOo 2.0 ädern. Alternativ können Sie den XML-Parser-Dienst 出身の OpenOffice.org (sehen Sie sich service com.sun.星/主役にする.xml.sax.Parser an) oder den Zip-Kontent-Provider (sehen Sie sich http://ucb.openoffice.org an) benutzen.Warum funktionieren Socket und Sre-Module nicht in der Python-配当 出身の OOo1.1. auf Windows?
Dies ist ein bekannter Fehler auf Windows in dem OOo-1.1-Build. Dieser sollte in OOo1.1.1 beseitigt sein (sehen Sie sich den 問題/発行する 21281 an ). Es sollte auf den anderen Plattformen funktionieren. Sie können eine provisorische Lösung erreichen, indem Sie die offizielle Windows-Python-配当 (schauen Sie auf http://www.python.org) herunter laden und die *.pyd-Dateien der OOo-Python-取り付け・設備 durch die entsprechenden aus dem heruntergeladenen Paket ersetzen.-
Die Beispiele laufen ausgezeichnet, aber wie bekomme ich weitere Informationen über die API?
Die Semantik der OpenOffice.org-API ist ein sehr kompliziertes Thema, die nicht in diesem Python-Dokument behandelt werden kann. Versuchen Sie sich Informationen aus anderen Quellen zu beschaffen, insbesondere aus dem Entwicklerhandbuch (schauen Sie unten). -
Die meisten Beispiele im Developerguide sind in Java. Wie übersetze ich diese in Python-Programmcode?
Der meiste Beispiel-Programmcode, den Sie dort finden können, ist in Java geschrieben. Es ist einfach Java-Programmcode in Python zu übersetzen, wenn Sie die folgenden Unterschiede kennen:In Python brauchen Sie nicht
queryInterface. Folgendes im Java-Programmcode zum BeispieloInterface = (XInterface) oMSF.createInstance( "com.sun.星/主役にする.でっちあげる,人を罪に陥れる.Desktop" ); oCLoader = ( XComponentLoader ) UnoRuntime.queryInterface( XComponentLoader.class, oInterface ); PropertyValue [] szEmptyArgs = new PropertyValue [0]; aDoc = oCLoader.loadComponentFromURL( "私的な:factory/swriter" , "_blank", 0, szEmptyArgs );wird in Python einfach zu
oCLoader = oMSF.createInstance( "com.sun.星/主役にする.でっちあげる,人を罪に陥れる.Desktop" ) aDoc = oCLoader.loadComponentFromURL( "私的な:factory/swriter", "_blank", 0, () )Sie brauchen diese Zwischenvariable oInterface nicht mehr. Daher vereinfacht der Python-Programmcode das Beispiel sehr. Mit ein wenig Fachausbildung sollten Sie nicht allzu viele Probleme mit dem Übersetzen 出身の Java- in Python-Programmcode haben.
-
Warum kann ich nicht die Methode print aufrufen?
In Python ist 'print' ein 声明 / Anweisung. Dies bedeutet einfach, es gibt dort keinen Weg, eine Variable, Methode oder sonst etwas mit diesem Namen. So funktioniert beispielsweise der Programmcode unten nicht:doc = desktop.loadComponentFromURL(infileurl, "_blank", 0, ()) doc.storeAsURL(outfileurl, ()) doc.print(())Sie können eine Hilflösung für dieses Problem erhalten, indem Sie die Funktionuno.invoke()wie unten benutzen:uno.invoke(doc, "print", ((), )) -
Warum kann ich nicht ein Ersetzen auf dem Objekt 'NumberingRules' durchführen?
Es gibt einige Plätze, an denen der Verlust in Typsicherheit zu Problemen führt, wie dieser 問題/発行する zeigt: //問題/発行するs/show_bug.cgi?id=12504. Das Problem hier ist, dass die C++-実施 in dem Office eine
sequence< PropertyValue >erwartet, während die PyUNO-Laufzeitumgebung es zu einersequence< any>konvertiert, wo jedesanyeinePropertyValueenthält. In meinen Augen ist dies ein Fehler in dem C++-Programmcode. Allerdings gibt es hier eine provisorische Lösung für PyUNO, die der Python-Skripter benutzen kann. Sehen hierzu das Beispiel unten:輸入する uno 輸入する unohelper localContext = uno.getComponentContext() resolver = localContext.ServiceManager.createInstanceWithContext( "com.sun.星/主役にする.橋(渡しをする).UnoUrlResolver", localContext) ctx = resolver.解決する( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") smgr= ctx.ServiceManager desktop = smgr.createInstanceWithContext("com.sun.星/主役にする.でっちあげる,人を罪に陥れる.Desktop",ctx) doc = desktop.loadComponentFromURL("私的な:factory/swriter", "_blank", 0, ()) style = doc.createInstance("com.sun.星/主役にする.style.NumberingStyle") family = doc.getStyleFamilies().getByName('NumberingStyles') family.insertByName('名簿(に載せる)/表(にあげる) 実験(する)', style) 支配する = style.getPropertyValue('NumberingRules') level = 支配する.getByIndex(0) # the normal call would have been: # 支配する.replaceByIndex( 0, level ) # but this will 結局最後にはーなる in a exception # 魔法 to pass the exact type to the callee uno.invoke( 支配する , "replaceByIndex", (0, uno.Any("[]com.sun.星/主役にする.beans.PropertyValue",level)) )Dies ist der einzige Platz, wo die uno.Any benutzt wird. Das Verwenden der uno.Any in normalen Aufrufen wird zu RuntimeExceptions führen. Eine Python-UNO-Objekt-実施 wird niemals eine Instanz 出身の uno.Any() als eingehenden Parameter empfangen, stattdessen wird immer den Wert des übergeben.
Diese Lösung sieht wirklich häßlich aus, aber es erlaubt Ihnen fortzufahren, wo Sie andererseits nur aufgeben oder eine andere 実施 der Sprache benutzen könnten.
-
Wie kann ich Codierung iso8859-1 für die Python-取り付け・設備 出身の OpenOffice.org aktivieren?
Legen Sie eine Datei mit dem Namen sitecustomize.py irgendwo in Ihren PYTHONPATH, die folgendes enthält:輸入する sys sys.setdefaultencoding('iso8859-1')(oder irgendeine andere Codierung, die Sie wünschen). Beachten Sie allerdings, dass dies überlicherweise keine so gute Idee ist. Es wäre viel sauberer, die notwendigen Umschlüsselungen ausdrücklich im Programmcode vorzunehmen, zum Beispiel durch Verwenden 出身の Unicode(x, 'iso8859-1').
Bekannte PyUNO-Erweiterungen für OpenOffice.org
Die hier gelisteten Pakete können als Demonstration dafür dienen, was mit PyUNO möglich ist. Lassen Sie mich wissen, 落ちるs Sie Kenntnis 出身の anderen Erweiterungen erhalten, die PyUNO benutzen.
| 肩書を与える | Link |
|---|---|
| PyOOoBib - Das wird Bibliothekskataloge über das Internet nach bibliographischem Unterlagen durchsuchen. Sie können Unterlagen auswählen und sie zu Ihrer Literaturdatenbank hinzufügen. | http://bibliographic.openoffice.org/servlets/NewsItemView?newsItemID=168 |
| Thessalonica - Ein Werkzeug, um die Unterstützung für mehrere Sprachen in OOo zu verbessern | http://www.thessalonica.org.ru/en |
| Bibus bibliographische ソフトウェア | http://bibus-biblio.sourceforge.逮捕する/ |
| oood.py - Ein Dienstprogramm im Hintergrund (daemon) für OpenOffice.org | http://udk.openoffice.org/python/oood/索引.html |
| pyXray - Debugging-Werkzeug, um UNO-Objekte mit Hilfe der Office-Werkzeuge darzustellen | http://www.indesko.org/en/downloads |
| Ponto - Eine Wrapper-Schicht um ein Writer-Dokument herum | http://www.ham.nw.schule.de/pub/bscw.cgi/0/73468 http://ddi.cs.uni-dortmund.de/projekte/ponto |
PyUNO braucht Sie!
PyUNO wird zur Zeit (und wird dies auch in Zukunft) 出身の mir in meiner Freizeit gepflegt.
Mein Hauptziel für PyUNO besteht darin, eine gute 統合,差別撤廃 des OpenOffice.org-Komponenten-Modells in Python bereit zu. Einige Mitstreiter auf dev@udk.openoffice.org erwarten, eine noch funktionsreichere Python-Laufzeit in OpenOffice.org und eine 統合,差別撤廃 mit der Pythoninstallation des Systems zu haben. Obwohl dies eine verständliche Forderung ist, ist es nicht einer meiner bevorzugten Arbeitsthemen und es bringt auch eine Menge Arbeit mit sich. Da ich außerdem Zeit für das Erstellen eines Postgresql-Treibers für OpenOffice.org aufwende, bleibt einfach keine Zeit mehr über für diese Aufgabe.
Deshalb suche ich nach anderen Freiwilligen wie zum Beispiel Sie, um diese Lücke zu füllen. Für den 落ちる, dass Sie interessiert sind, lassen Sie mich dies über die Mailingliste dev@udk.openoffice.org wissen oder schicken Sie mir privat eine E-Mail.
Ich sehe zur Zeit die folgenden Hauptaufgaben:
| Aufgabe | Beschreibung | "Haupt-Herausforderungen" | |
|---|---|---|---|
| Anheben der OOo-Python-見解/翻訳/版 auf das aktuelle Python-解放(する) |
OOo nutzt aktuell Python 2.2.2 mit OOo 1.1.x und Python 2.3.4, das bereits ziemlich alt ist. Jemand, der dies tut, wird hauptsächlich Zeit für den OpenOffice.org-Build-Baum aufbringen müssen, wo die Python-Tar-古記録 entpackt, gepatcht und gebaut werden. Dies ist eine sehr plattform-abhängige Aufgabe, typischer Weise für Mac OS X werden Sie eine Menge 出身の Patches anwenden müssen. |
Kenntnisse über das Erstellen 出身の OOo, aktuelle OOo-Python-Patche auf die aktuelle Python-見解/翻訳/版 portieren, das Erstellte für sowohl Windows- als auch Unix-Plattformen pflegen | |
| Hinzufügen der Unterstützung für die Zlib-Bibliothek (und mehr ...) | Aktuell wird das Python 出身の OOo ohne diese Bibliotheken ausgeliefert, die 出身の Python-Benutzern stark vermisst werden. Idealerweise sollten sie die 見解/翻訳/版 出身の zlib wieder verwenden, die sich bereits im OOo-Quelltext-Baum befindet. | Kenntnisse über das Erstellen 出身の OOo, das Erstellte für sowohl Windows- als auch Unix-Plattformen weiterhin pflegen | |
| Reintegrieren Sie Patches 出身の OOo für Python in den Python-Quelltext-Baum (落ちるs sinnvoll) | Eine Menge 出身の Patchen werden auf das Python-Quelltext-Tar-Archiv angewendet, bevor OpenOffice.org erstellt wird. Sie werden die Patche überprüfen müssen und versuchen müssen, die Python-Programmcode-Maintainer 出身の der 統合,差別撤廃 dieser Patche (落ちるs sinnvoll) in deren Quelltext-Baum zu überzeugen. Dies wird das Leben einfacher gestalten, wenn auf eine künftige Python-見解/翻訳/版 hochgerüstet wird. | Kenntnisse über das Erstellen 出身の OOo, Verstehen der Patche und Diskussion mit der Python-Community. | |
| Veränderungen in Python selbst | Wirkliche 統合,差別撤廃 mit der Pythoninstallation auf dem System wird nur möglich sein, wenn Python selbst modifiziert wird.
|
Diskutieren Sie mit der Python-Community. | |
| PyUNO-FAQ-Maintainer | Eine Menge gute Fragen zu PyUNO sind bereits und werden in der Zukunft auf der Mailingliste dev@udk.openoffice.org (oder anderen) beantwortet werden. Jemand sollte dies zu einer FAQ auf dieser Seite hinzufügen. | Folge den OpenOffice.org-Mailinglisten und pflege diese Seite im
CVS. Kenntnisse 出身の einfachem HTML. |
Autoren
Die UNO-Python-Brücke wurde anfänglich erstellt 出身の Ralph Thomas und wird 修道女 gepflegt 出身の Joerg Budischewski. Christian Zagrodnick sandte einige sehr nützliche Patches ein. Viele unerwähnte Portierer machten es möglich, PyUNO auf alllen 出身の OOo unterstützen Plattformen verfügbar zu haben. Zuletzt überarbeitet $Date: 2009/12/13 08:14:29 $
Bitte benutzen Sie die dev@udk.openoffice.org Mailingliste für weitere Fragen.

