Führen Sie beim Importieren eines Moduls mit Python, das LibreOffice ausführt, zusätzlich zu der üblichen Modulsuche die folgende Modulsuche durch.
Wenn Sie Python-Makros ausführen, enthält sys.path das Verzeichnis \ <LibreOffice-Installationsverzeichnis > / program. \ <LibreOffice-Installationsverzeichnis > ist / usr / local / lib / libreoffice für FreeBSD und% PROGRAMFILES% \ LibreOffice für Microsoft Windows. Importieren Sie von hier aus uno, unohelper, pythonscript, msgbox.
Wenn das Unterverzeichnis pythonpath des Verzeichnisses, in dem das Makro installiert ist, oder die Datei pythonpath.zip vorhanden ist, wird es zu sys.path hinzugefügt und ist die Symmetrie der Modulsuche.
Für Benutzermakros
%APPDATA%\LibreOffice\4\user\Scripts\python\pythonpath
%APPDATA%\LibreOffice\4\user\Scripts\python\pythonpath.zip
${HOME}/.config/libreoffice/4/user/Scripts/python/pythonpath
${HOME}/.config/libreoffice/4/user/Scripts/python/pythonpath.zip
Wird sein. Diese Pfade bleiben nach dem Beenden des Makros erhalten, bis Sie LibreOffice beenden. Es wird davon ausgegangen, dass die Loader-Klasse im Installationsverzeichnis \ <LibreOffice > /program/pythonloader.py enthalten ist. Die Funktion checkForPythonPathBesideComponent () in derselben Datei wird verwendet, um die Existenz zu überprüfen und zu sys.path hinzuzufügen.
Systemfreigabemakros und -erweiterungen werden ebenfalls hinzugefügt, sodass sys.path beim Aufrufen von Makros möglicherweise unnötige Verzeichnisse enthält.
Versuchen Sie beispielsweise, das folgende Makro auszuführen, um den Inhalt von sys.path in einem Meldungsfeld anzuzeigen.
syspath.py
import sys
from msgbox import MsgBox
def syspath_msgbox():
ctx = XSCRIPTCONTEXT.getComponentContext()
sys_path_box = MsgBox(ctx)
sys_path_box.addButton('oK')
sys_path_box.renderFromBoxSize(300)
sys_path = '\n'.join(sys.path)
sys_path_box.show(sys_path, 0, 'sys.path')
Folgendes wird angezeigt. Zu diesem Zeitpunkt wird das Unterverzeichnis pythonpath erstellt, die Datei pythonpath.zip ist jedoch nicht vorhanden. Das zweite angezeigte Verzeichnis / home / shota243 ist das aktuelle Verzeichnis, wenn LibreOffice gestartet wird. Zu diesem Zeitpunkt ist die Umgebungsvariable PYTHONPATH nicht festgelegt.
/usr/local/lib/libreoffice/program
/home/shota243
/usr/local/lib/python37.zip
/usr/local/lib/python3.7
/usr/local/lib/python3.7/lib-dynload
/home/shota243/.local/lib/python3.7/site-packages
/usr/local/lib/python3.7/site-packages
/home/shota/.config/libreoffice/4/user/Scripts/python/pythonpath
APSO --Alternative Script Organizer für Python Zeigen Sie sys.path über die Python-Interpreterkonsole der Erweiterung an Wenn Sie dies tun, ist es wie folgt.
APSO python console [LibreOffice]
3.7.7 (default, Jun 21 2020, 22:27:00)
[Clang 8.0.0 (tags/RELEASE_800/final 356365)]
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> for p in sys.path:
... print(p)
...
/usr/local/lib/libreoffice/program
/home/shota243
/usr/local/lib/python37.zip
/usr/local/lib/python3.7
/usr/local/lib/python3.7/lib-dynload
/home/shota243/.local/lib/python3.7/site-packages
/usr/local/lib/python3.7/site-packages
/home/shota243/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu2030qffpne.tmp_/apso.oxt/python/pythonpath
>>>
Das Installationsziel der APSO-Erweiterung ist /home/shota243/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu2030qffpne.tmp_. (Ausgelassen) lu2030qffpne.tmp_ / apso.oxt / python / apso.py ist der Hauptteil (Ausgelassen) im Verzeichnis lu2030qffpne.tmp_ / apso.oxt / python / pythonpath Die Module sind apso_debug.py, apso_utils.py und theconsole.py.
Programme, die Makros oder Uno importieren, können Bezeichner aus Modulen importieren, die mit com.sun.star beginnen.
Dies liegt daran, dass die Funktion \ _ \ _ import \ _ \ _ (), die den tatsächlichen Importstatus darstellt, durch die Funktion \ _uno \ _import () im Installationsverzeichnis \ <LibreOffice > /program/uno.py ersetzt wurde. com existiert nirgendwo im Modul-Suchpfad. Wenn in der Funktion \ _uno \ _import () die Standardfunktion \ _ \ _ import \ _ \ _ () nicht nach einem Modul sucht, versucht die Funktion pyuno.getClass (), es abzurufen. Zu diesem Zeitpunkt, da \ <Modulname > und \ <Bezeichner > von \ <Modulname > Import \ <Bezeichner > verkettet sind, um getClass () aufzurufen, \ <Modulname > Gesamtimport oder von Die Ausnahme ist der Massenimport mit \ <Modulname > Import *.
Beispiel:
mike% export PYTHONPATH="${PYTHONPATH}:/usr/local/lib/libreoffice/program"
mike% export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/usr/local/lib/libreoffice/program"
mike% export PATH="${PATH}:/usr/local/lib/libreoffice/program"
mike% python
python
Python 3.7.7 (default, Jun 21 2020, 22:27:00)
[Clang 8.0.0 (tags/RELEASE_800/final 356365)] on freebsd11
Type "help", "copyright", "credits" or "license" for more information.
>>> import uno
import uno
>>> from com.sun.star.uno import RuntimeException
from com.sun.star.uno import RuntimeException
>>> import com.sun.start.uno.RuntimeException
import com.sun.start.uno.RuntimeException
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/libreoffice/program/uno.py", line 356, in _uno_import
return _builtin_import(name, *optargs, **kwargs)
ModuleNotFoundError: No module named 'com'
>>> from com.sun.star.uno import *
from com.sun.star.uno import *
from com.sun.star.uno import *
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/libreoffice/program/uno.py", line 434, in _uno_import
raise uno_import_exc
File "/usr/local/lib/libreoffice/program/uno.py", line 356, in _uno_import
return _builtin_import(name, *optargs, **kwargs)
ImportError: No module named 'com' (or 'com.sun.star.uno.*' is unknown)
>>>
Die Referenz der Module und Bezeichner, die importiert werden können, wird als com :: sun :: star Module Reference betrachtet.
Recommended Posts