[Gelöst] Embedded Python-Modul: Wie importiert man aus einem anderen Modul?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

preklov
***
Beiträge: 76
Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet

[Gelöst] Embedded Python-Modul: Wie importiert man aus einem anderen Modul?

Beitrag von preklov »

Meine ersten Versuche, Basic-Code in OpenOffice nach Python zu übersetzen, führten zu einem ersten Problem.
Ich habe ein paar Module geschrieben, die im Userverzeichnis Scripts/python/module/... gut funktionieren. Die jeweiligen Unterverzeichnisse "pythonpath " mit "tools.py" sind automatisch im Pfad, so dass "from tools import tool1" klappt.

Mir gelingt es aber nicht, eine solche Konstruktion innerhalb eines Dokuments aufzubauen.

Meine manifest.xml enthält die Zeilen

Code: Alles auswählen

<manifest:file-entry manifest:media-type="" manifest:full-path="Scripts/python/testmodul/start.py"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/testmodul/"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/"/> 
Das reicht offensichtlich nicht aus, wenn ich die Dateien in Scripts/python/testmodul/ und Scripts/python/testmodul/pythonpath/ liegen habe.
Mit den zusätzlichen Zeilen ist die Datei wenigstens startbereit:

Code: Alles auswählen

<manifest:file-entry manifest:media-type="" manifest:full-path="Scripts/python/testmodul/pythonpath/tools.py"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/testmodul/pythonpath/"/>
Aber der import findet das Modul nicht. Auch diverse andere Konstellationen führten zu keinem Erfolg. Meine Internet-Recherchen haben mir keine verwertbaren Treffer gebracht. Was muss ich tun?

Volker

_________________
Moderation: Zur übersichtlichen Darstellung vom Programmcode im Text [​code][/code] Tags gesetzt. — lorbass, Moderator
Zuletzt geändert von preklov am Mi, 18.11.2015 21:09, insgesamt 1-mal geändert.
Schöne Grüße
Volker
preklov
***
Beiträge: 76
Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet

Re: Embedded Python-Modul: Wie importiert man aus einem anderen Modul?

Beitrag von preklov »

Ich bin einen Schritt weiter. Wenn ich sys.path um den Pfad des aktuellen Dateinamens mit der internen Verzeichnisstruktur erweitere, werden die anderen Module gefunden. Ich brauche gar nicht das Unterverzeichnis pythonpath. Die Datei tools.py liegt nun auch im Verzeichnis testmodul.
Bei meinem Beispiel sieht es also so aus:

Code: Alles auswählen

import uno
import sys
from com.sun.star.beans import PropertyValue

def path_test()
    doc = XSCRIPTCONTEXT.getDocument()

    docArgs = []
    docArgs = doc.getArgs()
    p = PropertyValue

    for p in docArgs:
        if p.Name == 'URL':
            URL = uno.fileUrlToSystemPath(p.Value)
            break
    URL = URL + '/Scripts/python/testmodul'
    
    if URL not in sys.path:
        sys.path.append(URL)

    from tools import tool1
    ...
    
Irgendwie stehe ich aber auf dem Schlauch und weiß nicht, wie ich tool1 global sichtbar mache. Ich habe noch gewaltige Lücken in Python.

Kann mir jemand auf die Sprünge helfen?

Volker
Schöne Grüße
Volker
Karolus
********
Beiträge: 7441
Registriert: Mo, 02.01.2006 19:48

Re: Embedded Python-Modul: Wie importiert man aus einem anderen Modul?

Beitrag von Karolus »

Hallo

Ich lass erstmal die technischen Fragen aussen vor.

Warum willst du eine solche Struktur in ein normales Dokument einbetten?
Alles was global für deinen python-Interpreter sichtbar (importierbar) sein soll ist doch eigentlich in ..<benutzer>.../site-packages/ besser aufgehoben!?

____

zum deinem Code:

doc.getArgs() gibt dir von selbst PropertyValue's zurück, du musst das nicht generisch importieren.

du bindest PropertyValue an den Namen p, um gleich danach suksessiv alle Elemente aus `doc.getArgs()` an den Namen zu binden ???

im übrigen kannst du das direkt per Attributzugriff in einer Zeile machen:

Code: Alles auswählen

doc = XSCRIPTCONTEXT.getDocument()
sys.path.append(uno.fileUrlToSystemPath(doc.URL) +"/Scripts/python/testmodul/")
Ausserdem funktioniert das SO nicht, dir scheint es nur so weil bereits vorher andererweitig `.../tools/tools1.py` erfolgreich importiert wurde.
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
preklov
***
Beiträge: 76
Registriert: Mo, 29.06.2009 09:04
Wohnort: Ruhrgebiet

Re: Embedded Python-Modul: Wie importiert man aus einem anderen Modul?

Beitrag von preklov »

Danke Karolus, deine Antwort war genau das, was ich suchte.
Warum willst du eine solche Struktur in ein normales Dokument einbetten?
Weil ich neugierig bin. Ich will wissen, ob man Python-Code dateigebunden weitergeben kann. Nicht für alles ist eine Extension angebracht. Ob Basic die bessere Lösung für solche Aufgaben ist, will ich erst einmal herausfinden.
Du bindest PropertyValue an den Namen p, um gleich danach suksessiv alle Elemente aus `doc.getArgs()` an den Namen zu binden ???
Hast Recht, war völliger Quatsch. Habe ich ohne Nachdenken so aus einer Internetquelle abgeschrieben.
Ausserdem funktioniert das SO nicht, dir scheint es nur so weil bereits vorher andererweitig `.../tools/tools1.py` erfolgreich importiert wurde.
tool1 ist eine (Test-)Funktion in tools.py. Diese Datei liegt nun neben start.py im Verzeichnis testmodul. Das Unterverzeichnis pythonpath habe ich entfernt. Daher sind auch die beiden zusätzlichen Zeilen in der Datei manifest.xml (s. Originalpost) nicht mehr nötig.

Ich verstehe aber nicht, wann und von was der Import vonstatten gegangen sein soll. Beim Versuch zu importieren wurde mir immer das Nichtvorhandensein des Moduls tools moniert. Erst mit den Zeilen

Code: Alles auswählen

import uno
import sys
doc = XSCRIPTCONTEXT.getDocument()
if uno.fileUrlToSystemPath(doc.URL) + '/Scripts/python/testmodul/' not in sys.path:
    sys.path.append(uno.fileUrlToSystemPath(doc.URL) + '/Scripts/python/testmodul/')
from tools import tool1
im globalen Teil wird alles einfach. Die Funktion path_test ist dadurch überflüssig.

Volker
Schöne Grüße
Volker
Antworten