Script transformé en .exe fonctionne sur un pc mais pas sur un autre
Salut à tous,
Dans le cadre de mon travail je travaille sur un script permettant de renommer des fichiers .pdf en masse, en fonction d'un ou de plusieurs chaines de caractères respectant un format précis dans le pdf. Quand j'ai un fichier .pdf natif, OK, par contre il m'arrive d'avoir des fichiers scannés, pour ça j'utilise pytesseract (il existe peut-être mieux...), pour transformer une image en texte (OCR). Mon script n'est probablement pas optimisé, mais il fonctionne sur ma machine. J'ai dû aussi mettre à jour les variables d'environnement. Et afin de pouvoir utiliser mon programme au travail, j'ai converti en .exe avec pyinstaller. Le fichier .exe fonctionne sur mon pc, mais pas sur celui de mon travail (je précise quand même que les 2 pc tournent sous win10). Est-ce à cause des variables d'environnement? Possible de contourner ce problème? Merci d'avance!
Salut !
Alors effectivement si tu utilises les variables d'environnement elles ne seront pas encapsulées dans le .exe. À la place tu peux utiliser un fichier de configuration (par exemple un fichier JSON, ou sur les dernières versions de Python tu peux aussi utiliser TOML qui dispose désormais d'une lib permettant de lire ce format).
Salut Thibault,
OK merci! Bon, je ne suis pas très à l'aise avec les variables d'environnement... En farfouillant un peu j'ai fait ça:
-
Création d'un fichier json "config.json" avec le contenu suivant:
{ "pytesseract_path": "C:\\Program Files (x86)\\Tesseract-OCR" } -
Dans mon script python, je charge le fichier:
with open('config.json', 'r') as f: config = json.load(f) -
Et ensuite:
pytesseract.pytesseract.tesseract_cmd = "C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe" pytesseract.pytesseract.tesseract_cmd = config['pytesseract_path']
Mais ça ne fonctionne pas, j'ai pas mal d'erreurs...
Traceback (most recent call last):
File "d:\PROGRAMMATION\PDF\Extract_from_pdf\Split_pdfs\splitting_pdfs_pathlib.py", line 109, in <module>
text = pytesseract.image_to_string(imgBlob, lang='eng')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\dvdri\AppData\Local\Programs\Python\Python311\Lib\site-packages\pytesseract\pytesseract.py", line 423, in image_to_string
return {
^
File "C:\Users\dvdri\AppData\Local\Programs\Python\Python311\Lib\site-packages\pytesseract\pytesseract.py", line 426, in <lambda>
Output.STRING: lambda: run_and_get_output(*args),
^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\dvdri\AppData\Local\Programs\Python\Python311\Lib\site-packages\pytesseract\pytesseract.py", line 288, in run_and_get_output
run_tesseract(**kwargs)
File "C:\Users\dvdri\AppData\Local\Programs\Python\Python311\Lib\site-packages\pytesseract\pytesseract.py", line 255, in run_tesseract
proc = subprocess.Popen(cmd_args, **subprocess_args())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\dvdri\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 1022, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\dvdri\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 1491, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [WinError 5] Accès refusé
Ou alors il y a peut-être une autre biblio que pytesseract qui ne nécessite pas de passer par des variables environnement...?
Merci d'avance!
hello,
pytesseract.exe est t´il installé sur la machine pour laquelle ton script ne fonctionne pas ? pareil je pense que pytesseract n´est pas encapsulé dans ton executable
Salut!
En fait non, pytesseract.exe est installé sur mon pc perso, avec les variables d'environnement bien à jour. Et du coup j'aimerais avoir un .exe contenant tout afin de l'exécuter sur l'autre pc sur lequel je ne peux pas modifier les variables d'environnement, ni installer python ou quoi que ce soit d'autre. Donc j'ai essayé de modifier mon script en incluant un fichier de config json, pour ensuite compiler le tout en fichier .exe, mais je galère, et les erreurs ci-dessus viennent de mon script (qui fonctionne bien si j'enlève la partie création du fichier de config...). C'est rageant d'avoir un script qui marche sur un pc et ne pas pouvoir l'exporter...! :)
Hello,
s'il n'y a pas pytesseract sur le pc surlequel tu veux utiliser installer ton script, malheureusement ça ne fonctionnera pas.
Au fait ici:
pytesseract.pytesseract.tesseract_cmd = "C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe"
pytesseract.pytesseract.tesseract_cmd = config['pytesseract_path']
Ta première ligne ne sert pas car tu écrases juste après la variable crée avec la valeur qu'il y a dans le config.
Hello,
non je ne dirais pas ça car à ma connaissance pytesseract pour l'OCR c'est très bien. Je peux me tromper mais à mon avis c'est plutot la manière dont tu veux distribuer ton propgramme qu'il faudriat changer. Dans ce genre de situations, en tout cas c'est ce que je fais, le mieux c'est d'avoir une plateforme web qui gère toutes les lib externe et tes users accèdent à ta web app de cette manière. J'ai d'ailleurs déjà eu ce problème et j'ai refait mon app avec streamlit.
Et en gros c'est streamlit qui gère sur leur plateforme l'installation des lib et logiciels extrenes nécessaires. Cette app que j'avais faite utilise aussi pytesseract

ellle permet de récupéer du texte dans un pdf scanné. Là ton user n'a rien à installer, il va juste sur l'url de ton app que tu lui envoies. Avec streamlit tu peux heberger gratuitement ton app. Il suffit que ton code soit sur github.
Ah ben oui pardon. Le voici: https://pacourbet-pdf-manip-main-hf0m7e.streamlit.app
J'avais fait un mentorat sur streamlit il y a quelques temps si tu veux. Par exemple dans ce cas tu n'auras qu'à mettre un fichier "packages.txt"
poppler-utils
tesseract-ocr
sur ton repo github et la plateforme installera pour toi tout ce qu'il faut.
A ta disposition si tu as des questions.
Salut PA,
Parfait merci pour la dernière vidéo! Ca m'a bien aidé. J'ai réussi à mettre en ligne sur streamlit, via mon Github mais il faut maintenant que j'ajoute un minimum d'interface graphique, car mon appli à la base se contentait de lire dans un dossier précis (le dossier courant où se situe le script) et de décoder pui renommer tous les pdfs, sans aucun critère de sélection.
J'essaye de faire une interface graphique sur streamlit.
Salut!
J'ai réussi à faire une petite app, avec un file_uploader qui permet d'aller sélectionner les fichiers .pdf que je souhaite renommer.
Mais après, comment sélectionner un dossier dans lequel itérer sur chaque fichier et y appliquer une fonction? Car les fichiers importés ne sont dans aucun dossier, ils sont sur le serveur streamlit.
Le file_uploader ne permet pas - à ma connaissance en tout cas - de sélectionner un dossier, mais seulement des fichiers. Comment peut-on sélectionner un dossier et récupérer le chemin?
Je sèche un peu sur cette partie là...
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte