Programme python qui ne fonctionne plus

Bonsoir,
J’ ai rédigé un petit programme en python qui me permet de savoir combien d’ actions je peux acheter en fonction de la cote du titre et du montant des frais.
Lorsque je lance le script dans “Thonny”, interpréteur python, il fonctionne.
En utilisant l’ interpréteur python inclus dans “Apso”, pas de soucis non plus.
Depuis libreoffice 7.5.2 et son module base, l’ appel du script me renvoie le message d’ erreur suivant

Erreur d' exécution Basic
Une exception c' est produite:
Type: com.sun.star.script.provider.ScriptFrameworkErrorException
Message: <class 'ImportError'>:No module named 'achatvente' (or
'achatvente.cht.achat' is unknown)
File "/opt/libreoffice7.5/program/pythonscript.py", line 1057, in getscript
mod = self.provCtx.getModuleByUrl(fileUri)
File "/opt/libreoffice7.5/program/pythonscript.py", line 494, in getModuleByUrl
exec(code, entry.module._dict_)
File "/home/elfouster/.config/libreoffice/4/user/Scripts/python/
ordrebourse.py", line 3, in <module>
from achatvente.cht import achat
File "/opt/libreoffice7.5/program/uno.py", line 425, in_uno_import raise uno_import_exc
File "/opt/libreoffice7.5/program/uno.py", line 346, in_uno_import return_builtin_import(name *optargs, **kwargs)

Contrairement au message, le dossier “achatvente” se trouve bien dans le même dossier que le script lancé.
En premier le code basic qui appelle le script python

Sub OrdreBourse()

	Dim masterSPF as Object, scriptP as object, Mnscript as object
	Dim NmScript as string, Langage as string, Pst as string

	NmScript = "ordrebourse.py$ordre"
	Langage = "Python"
	Pst = "user"
	masterSPF = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
	scriptP = masterSPF.createScriptProvider("")
	MnScript = scriptP.getScript("vnd.sun.star.script:" & NmScript & "?language=" & Langage & "&location=" & Pst)
	MnScript.invoke(Array(), Array(), Array())
	
End Sub

C’ est un bouton dans un formulaire qui d’éclanche ce programme.
Le script appelé est

#!/usr/bin/env python3

from achatvente.cht import achat
from achatvente.vnt import vente

ordre = input ("Voulez-vous effectuer un achat d' action ? ")

if ordre == 'o' or ordre == 'O':
    achat()
else :
    vente()

Sous réserve de vous avoir bien transmis toutes les informations, avez-vous une idée du problème?
Cordialement

Tu devrais simplement copier les deux fonctions dans le script d’appel… ( python n’est pas Java où tout est réparti dans douze dossiers, sous-dossiers et fichiers ).

Bonjour,
En fait, je suis en version stable LibreOffice 7.4.7.2 et je m’ aperçois que plus aucun script python ne fonctionne depuis LibreOffice base?
Cordialement

Bonjour,

Python2 ou Phython3?
Python2 est “mort”

Bonjour,
Il s’ agit bien entendue de Python 3. En fait, se sont bien tous les programmes python que l’ on ne peut plus lancer depuis libreoffice base.
Cordialement

Il est plus rigoureux d’utiliser l’extension .py3 pour du python3.
Mais chez moi, le fait que certains de mes programmes Python3 soient nommés *.py ne les empêchent pas de tourner sur le Terminal Linux.

Désolé de ne pas pouvoir t’aider plus, je n’ai que de très modestes connaissances sur le sujet.

Bonsoir,
Tous mes scripts Python fonctionnent sans aucun problème, aussi bien depuis le terminal Xubuntu ou que depuis l’ IDE Thony. C’ est uniquement lorsque je les lance depuis LibreOffice Base qu’ ils ne fonctionnent pas.
Par contre, je suis surpris de votre extension .py3, c’ est bien la première fois que je vois une telle extension.
Merci d’ avoir tenté d’ apporte un éclairage sur ce problème.
Si par hasard, un utilisateur de LibreOffice Base et de Python passe par la, peut-il me dire s’ il rencontre également ce type de difficulté!
Cordialement

L’extension de fichier …py3 est également un non-sens !

Mais il existait ces dernières années, quand on devait travailler avec python2 et python3, les alias “python2”, “python3”, “pip2”, pip3 … pour démarrer|utiliser l’environnement souhaité.
Aujourd’hui, ce n’est plus nécessaire, car on n’utilise plus que python3 !

Je ne travaille pas avec Base, mais pour t’aider, il faudrait au moins voir ton code source !

Effectivement, j’ai appris python, il y a quelques années, au moment de la transition et j’ai un peu arrêté de bidouiller depuis.

Sous Ubuntu 20.04 que j’utilise, même si Python2 à disparu, il est toujours nécessaire d’utiliser la commande “Python3” sur le terminal pour accéder à Python.

Tu as essayé ceci?
Aide LibreOffice 7.5

Je travaille ici avec “Debian Bullseye”, qui est une distribution très conservatrice… je peux donc appeler l’interpréteur python 2 via “python2”, et python 3 via “python” et l’alias “python3”.

mais je n’ai jamais rencontré d’extension de fichier du type …py2 ou py3 !

ps. j’ai explicitement installé python 2.7 après coup, il n’était plus présent dans l’installation standard !

j’ai fouiné sur la toile et effectivement l’extension “.py3” semble marginale et ne pas faire l’unanimité. Peut être que le conseil que l’on avait donné n’était judicieux qu’au moment de la disparition de python 2. Je m’excuse.

Bonjour,
Pas de soucis pour cette histoire d’ extention. Pour info, je joins les deux scripts qui ne fonctionnent plus:
#!/usr/bin/env python3

from os import chdir
from datetime import datetime
from bs4 import BeautifulSoup
import urllib.request
import ssl

#Fonction appelée
def Control_Action(ev):
ctrl = ev.Source
frm = ev.Source.Model.Parent
subform = frm.getByName(“Mn_Gn”)

#Fichier de sauvegarde
chdir(’/mnt/El_Casot/Yvon/Finance/Bourse’)
with open(“cotes_jour.csv”, “w”) as fch: pass

#Recherche de la date du jour
datejour = datetime.today().strftime(’%Y-%m-%d’)
#print (datejour)

#Dictionnaire de titres
titre = {“1”:“https://www.boursorama.com/cours/1rPAF/",“2”:"https://www.boursorama.com/cours/1rPACA/”,
“5”:“https://www.boursorama.com/cours/1rPFDJ/",“7”:"https://www.boursorama.com/cours/1rPRNO/”,
“8”:“https://www.boursorama.com/cours/1rPCA/",“10”:"https://www.boursorama.com/cours/1rPGLE/”,
“11”:“https://www.boursorama.com/cours/1rPSGO/",“12”:"https://www.boursorama.com/cours/1rPABNX/”,
“13”:“https://www.boursorama.com/cours/1rPEOS/",“14”:"https://www.boursorama.com/cours/1rPBOL/”,
“16”:“https://www.boursorama.com/cours/1rPENGI/",“17”:"https://www.boursorama.com/cours/1rPLAT/”,
“18”:“https://www.boursorama.com/cours/1rPMERY/",“19”:"https://www.boursorama.com/cours/1rPFNAC/”,
“20”:“https://www.boursorama.com/cours/1rPPVL/",“21”:"https://www.boursorama.com/cours/1rPSAN/”,
“22”:“https://www.boursorama.com/cours/1rPSW/",“23”:"https://www.boursorama.com/cours/1rPITP/”,
“25”:“https://www.boursorama.com/cours/1rPDBV/",“26”:"https://www.boursorama.com/cours/1rPAC/”,
“27”:“https://www.boursorama.com/cours/1rPALO/",“28”:"https://www.boursorama.com/cours/1rPOSE/”,
“30”:“https://www.boursorama.com/cours/1rPSCR/",“31”:"https://www.boursorama.com/cours/1rPCRI/”,
“32”:“https://www.boursorama.com/cours/1rPALD/",“33”:"https://www.boursorama.com/cours/1rPABCA/”,
“34”:“https://www.boursorama.com/cours/1rPATE/",“35”:"https://www.boursorama.com/cours/1rPAKA”,
“36”:“https://www.boursorama.com/cours/1rPMBWS/",“37”:"https://www.boursorama.com/cours/1rPEN/”,
“38”:“https://www.boursorama.com/cours/1rPTKTT/",“41”:"https://www.boursorama.com/cours/1rPML/”,
“42”:“https://www.boursorama.com/cours/1rPDLT/",“43”:"https://www.boursorama.com/cours/1rPSU/”,
“44”:“https://www.boursorama.com/cours/1rPIPS/",“45”:"https://www.boursorama.com/cours/1rPDG/”,
“46”:“https://www.boursorama.com/cours/1rPVK/",“47”:"https://www.boursorama.com/cours/1rPTFI/”,
“48”:“https://www.boursorama.com/cours/1rPEXE/",“49”:"https://www.boursorama.com/cours/1rPPIG/”,
“50”:“https://www.boursorama.com/cours/1rPDEC/",“51”:"https://www.boursorama.com/cours/1rPMAU/”,
“52”:“https://www.boursorama.com/cours/1rPNRG/",“53”:"https://www.boursorama.com/cours/1rPSOI/”,
“54”:“https://www.boursorama.com/cours/1rPBNP/",“55”:"https://www.boursorama.com/cours/1rPADP/”,
“56”:“https://www.boursorama.com/cours/1rPELIOR/",“57”:"https://www.boursorama.com/cours/1rPCS/”,
“58”:“https://www.boursorama.com/cours/1rPSTLAP/",“59”:"https://www.boursorama.com/cours/1rPDAR/”,
“60”:“https://www.boursorama.com/cours/1rPVLA/",“62”:"https://www.boursorama.com/cours/1rPNXI/”,
“63”:“https://www.boursorama.com/cours/1rPALATA/",“65”:"https://www.boursorama.com/cours/1rPCGG/”,
“66”:“https://www.boursorama.com/cours/1rPABVX/",“67”:"https://www.boursorama.com/cours/1rPELIS/”,
“68”:“https://www.boursorama.com/bourse/indices/cours/1rPCAC/",“69”:"https://www.boursorama.com/cours/1rPBN/”,
“70”:“https://www.boursorama.com/cours/1rPSPIE/",“71”:"https://www.boursorama.com/cours/1rPALMRB/”,
“72”:“https://www.boursorama.com/cours/1rPMDM/",“73”:"https://www.boursorama.com/cours/1rPORP/”,
“74”:“https://www.boursorama.com/cours/1rPCGM/",“75”:"https://www.boursorama.com/cours/1rPVETO/”,
“76”:“https://www.boursorama.com/cours/1rPSMCP/",“77”:"https://www.boursorama.com/cours/1rPGBT/”,
“78”:“https://www.boursorama.com/cours/1rPLACR/",“79”:"https://www.boursorama.com/cours/1rPVIE/”,
“80”:“https://www.boursorama.com/cours/1rPTTE/",“81”:"https://www.boursorama.com/cours/1rPAB/”,
“82”:“https://www.boursorama.com/cours/1rPICAD/",“83”:"https://www.boursorama.com/cours/1rPERF/”,
“85”:“https://www.boursorama.com/cours/1rPALNMR/",“87”:"https://www.boursorama.com/cours/1rPALLOG/”,
“88”:“https://www.boursorama.com/cours/1rPIPH/",“89”:"https://www.boursorama.com/cours/1rPTNG/”,
“90”:“https://www.boursorama.com/cours/1rPAVT/",“92”:"https://www.boursorama.com/cours/1rPNANO/”,
“93”:“Pétrole Brent, Cours Pétrole Brent BRN - Prix, Cotation, Bourse Ice Europ - Boursorama”,
#“94”:“Boursorama, Votre partenaire pour investir”,
“97”:“https://www.boursorama.com/cours/1rPVMX/",“99”:“https://www.boursorama.com/cours/1rPWAGA/”,“100”:"https://www.boursorama.com/cours/1rPVLTSA/”,
“101”:“https://www.boursorama.com/cours/1rPPARRO/",“102”:"https://www.boursorama.com/cours/1rPALNEV/”,
“103”:“https://www.boursorama.com/cours/1rPTCHCS/",“104”:"https://www.boursorama.com/cours/1rPVANTI/”,
“105”:“https://www.boursorama.com/cours/1rPLBIRD/",“106”:"https://www.boursorama.com/cours/1rPPHXM/”,
“107”:“https://www.boursorama.com/cours/1rPADOC/",“108”:"https://www.boursorama.com/cours/1rPMETEX/”,
“109”:“CLARIANE Cours Action CLARI, Cotation Bourse Euronext Paris - Boursorama”}
i = 1
#Extraction des données de la page
for key, valeur in titre. items() :
#Récupération de la clé du titre
url = valeur
cfttr = key
cfcote = i
#Extraire la cote d’ ouverture
rqt = urllib.request.Request(url)
#Passer outre la vérification de certificat
context = ssl._create_unverified_context()
rslt = urllib.request.urlopen(rqt, context=context)
#rslt = urllib.request.urlopen(rqt)
soup = BeautifulSoup(rslt, ‘html.parser’)
ouverture = soup.select(".c-instrument–open")[0].text
if cfttr == ‘68’:
ouverture = ouverture.replace(’ ‘,’’)
# Création de la liste cotation
listecote=soup.find(“div”,“c-faceplate”)
cotation = listecote[“data-ist-init”]
#Extraire la cote la plus haute
departhaut= cotation.index(’,’)
departvaleurhaut = cotation.index(’:’, departhaut)
finhaut = cotation.index(’,’ , departvaleurhaut)
haut = cotation[(departvaleurhaut + 1):finhaut]
#Extraire la cote la plus basse
departvaleurbas = cotation.index(’:’,finhaut)
finbas = cotation.index(’,’, departvaleurbas)
bas = cotation[(departvaleurbas + 1):finbas]
#Saut de la cote de fermeture de la veille
departvaleurfermeture = cotation.index(’:’,finbas)
finfermeture = cotation.index(’,’, departvaleurfermeture)
#Extraire le volume échangé
departvaleurvolume = cotation.index(’:’, finfermeture)
finvolume = cotation.index(’,’, departvaleurvolume)
volume = cotation[(departvaleurvolume + 1): finvolume]
if cfttr == ‘68’:
volume = volume + ‘000’
#Extraire la date de la cotation
departvaleurdate = cotation.index(’:’, finvolume)
findate = cotation.index(’,’, departvaleurdate)
datecote = cotation[(departvaleurdate + 2): (findate - 10)]
#print ('date : ', datecote)
#if datejour == datecote :
# message = “La bourse est ouverte”
#else :
# message = “La bourse est fermée ce jour”
#print (message)

#Extraire la variation du cours
departvaleurvariation = cotation.index(':', findate)
finvariation = cotation.index(',', departvaleurvariation)
variation = cotation[(departvaleurvariation + 1): finvariation]
#print ('pourcentage : ',variation)
#Extraire la cote du jour
departvaleurcote = cotation.index(':', finvariation)
fincote = cotation.index(',', departvaleurcote)
cote = cotation[(departvaleurcote + 1): fincote]
print ('Cote du jour : ', cfttr , ' - ',cote)
#Sauvegarde des données
with open('cotes_jour.csv', 'a') as fch:
    if i == 1:
        #fch.write('Cf_Cote');fch.write(',');
        fch.write('CfTtr'); fch.write(','); fch.write('Date'); fch.write(','); fch.write('Cotation')
        fch.write(','); fch.write('Ecart'); fch.write(','); fch.write('Ouverture'); fch.write(',')
        fch.write('Haut');fch.write(','); fch.write('Bas');fch.write(',');fch.write('Volume')
        fch.write('\n')
    #fch.write(str(cfcote)); fch.write(',');
    fch.write(cfttr); fch.write(','); fch.write(str(datecote)); fch.write(','); fch.write(str(cote))
    fch.write(','); fch.write(str(variation)); fch.write(','); fch.write(str(ouverture)); fch.write(',')
    fch.write(str(haut));fch.write(','); fch.write(str(bas));fch.write(','); fch.write(str(volume))
    fch.write('\n')
i += 1

Ce script se lance normalement depuis une macro Basic. La fonction
def Control_Action(ev):
n’ a été rajoutée que pour tenter de contourner le problème.
Le deuxième script est l’ objet du premier message. Je le rajoute uniquement pour que vous ayez l’ ensemble dans le même message.

#!/usr/bin/env python3

from achatvente.cht import achat
from achatvente.vnt import vente

def Control_Action(ev):
    ctrl = ev.Source
    frm = ev.Source.Model.Parent
    subform = frm.getByName("F_Ctn")

try :
    ordre = input ("Voulez-vous effectuer un achat d' action ? ")
    if ordre == 'o' or ordre == 'O':
        achat()
    else :
        vente()

except EOFError as e :
    print (e)
avec ces sous programme:
def achat():
    mntinvestissement = input("combien voulez-vous investir ? ")
    a = int(mntinvestissement)
    vlractions = input("Cote d' une action ?                     ")
    valeur = float(vlractions) 
    x = int(a/valeur)
    print("Vous pouvez acheter un maximum de " ,x, "actions")
    nbractions = input("Combien voulez-vous acheter d' actions ? ")
    # Calcul du montant des frais
    xactions = int(nbractions)
    mntcht = valeur  * xactions
    b = float(mntcht)
    if b <= 500 :
        frais = 1.95
    elif b > 500 and b < 2000 :
        frais = 3.90
    elif b >= 2000 :
        frais = b * 0.020
    
    frsgst = float(frais)
    montant = (xactions*valeur) + frsgst
    mntachat = float(montant)
    prixrevient = mntachat / xactions
    prixunit = float(prixrevient)
    ventemini = prixunit * 1.05
    print ("Cout de l' opération  : ",round(mntachat, 3), " €")
    print ("Prix de revient unitaire :",round(prixrevient, 3), " €")
    print ("prix de vente minimum : ", round(ventemini, 3), " €")
 

if __name__ == "__main__":
    achat()
def vente():
    nbractions = input("Combien voulez-vous vendre d' actions ? ")
    vlractions = input("Cote d' une action ?                     ")
    xactions = int(nbractions)
    valeur = float(vlractions)
    # Calcul du montant des frais
    mntvnt = valeur  * xactions
    b = float(mntvnt)
    if b <= 500 :
        frais = 1.95
    elif b > 500 and b < 2000 :
        frais = 3.90
    elif b >= 2000 :
        frais = b * 0.020
    frsgst = float(frais)
    recette = (xactions*valeur) - frsgst
    mntvente = float(recette)
    prixrevient = mntvente / xactions
    prixunit = float(prixrevient)
    print ("Bilan de l' opération : ", round(recette, 3), ' €')
    print ("Prix de revient unitaire :", round(prixunit, 3), ' €')
 
if __name__ == "__main__":
    vente()
Voila ce que je peux vous communiquer comme information.
Cordialement

Dans un programme digne de ce nom, on n’utilise jamais “os.chdir(…)”, mais on travaille avec des chemins absolus et on utilise “Path” du module “pathlib” pour les créer.

…csv, on n’additionne pas des instructions …write(…), mais on utilise pour cela le module “csv”.

Bonjour,
Je vous remercie de vos conseils que je vais m’ appliquer à mettre en œuvre. Il est vrai que j’ ai réalisé ces scripts depuis un petit moment déjà. Comme ils fonctionnaient je ne suis jamais revenu dessus depuis.
Ceci dit, et en fonction du fait que je pouvais les utiliser sans problèmes depuis leur créations et jusqu’ à cette dernière version de LO Base, le soucis vient d’ ailleurs.
Je penche plus sur un bug ?
Patientons donc jusqu’ à la sortie d’ une nouvelle mise à jour.
Cordialement

Ce n’est pas l’attitude à avoir. Il faut informer les développeurs en ouvrant un rapport de bug.