Résolue

Script transformé en .exe fonctionne sur un pc mais pas sur un autre

# Fichiers # Variables # Scripting

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!

Thibault houdon

Mentor

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:

  1. Création d'un fichier json "config.json" avec le contenu suivant:

    {
        "pytesseract_path": "C:\\Program Files (x86)\\Tesseract-OCR"
    }
    

  2. Dans mon script python, je charge le fichier:

    with open('config.json', 'r') as f:
        config = json.load(f)
    

  3. 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.

Salut,
OK merci donc si je comprends bien, pytesseract ne semble pas être la meilleure option pour mon projet. Il faut donc que je trouve un autre package ocr qui ne nécessite pas d'utiliser des variables environnement?

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

Users/pacourbet/Library/Application Support/CleanShot/media/media_6o3WqxRgVZ/CleanShot 2023-03-29 at 16.18.18@2x.png
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.

Tu peux la tester ici si tu veux:

Re,
OK c'est top ça! En effet ça semble être une bonne option. Je vais essayer tout ça voir comment ça fonctionne et je te fais un retour.
Par contre pour le test, il n'y a pas le lien...? :)
Merci!

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,
OK super, je vais regarder la vidéo sur streamlit, et je teste tout ça!
Il est possible que j'ai quelques questions après :)

hello,

pas de souci. J'en ai reparlé aujourd'hui de streamlit. La rediff sera dispo demain. Pas de souci pour les 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.

super ! tiens moi au courant si tu as des problemes

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 !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.