Résolue

Streamlit erreur exécution en ligne - OK en local

# Résolution d'erreurs # Fichiers # Streamlit

Hello,

J'ai enfin terminé mon app pour renommer des fichiers pdf, ça fonctionne bien en local sur streamlit. Quand je déploie en ligne sur streamlit via Github, j'ai une erreur au moment de valider le chemin du dossier de sauvergarde des fichiers (st.text_input):

FileNotFoundError: This app has encountered an error. The original error message is redacted to prevent data leaks. Full error details have been recorded in the logs (if you're on Streamlit Cloud, click on 'Manage app' in the lower right of your app).
Traceback:
File "/home/appuser/venv/lib/python3.9/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 565, in _run_script
    exec(code, module.__dict__)
File "/app/rename_pdfs_with_streamlit/main.py", line 56, in <module>
    pdf_files_list = [file for file in output_folder.iterdir() if (file.is_file() and file.suffix == ".pdf")]
File "/app/rename_pdfs_with_streamlit/main.py", line 56, in <listcomp>
    pdf_files_list = [file for file in output_folder.iterdir() if (file.is_file() and file.suffix == ".pdf")]
File "/usr/local/lib/python3.9/pathlib.py", line 1160, in iterdir
    for name in self._accessor.listdir(self):

Je ne vois pas trop ce qui ne va pas...

Lien repo Github:
https://github.com/RIVIEREDavid/Rename_pdfs_with_streamlit

Merci d'avance!

Hello,

oui je comprends que ça fonctionne en local mais pas en prod. C'est une sécurité, depuis le streamlit cloud le script n'est pas autorisé à aller parcourir ton dossier qui est sur ta machine et c'est normal.

je vois que pour tes pdfs tu veux lister les fichiers qui sont sur ton local

pdf_files_list = [file for file in output_folder.iterdir() if (file.is_file() and file.suffix == ".pdf")]

pourquoi tu n'utilises pas directement les uploaded_files ?

Saches que depuis le streamlit cloud tu ne pourras ni lire le contenu d'un dossier ni écrire dedans. Tu ne peux que "uploader" des fichier ou créer des fichiers et permettre de les "downloader".

Salut!

OK merci de l'info, donc je comprends que je dois tout faire sans rien manipuler en local, et ajouter à la fin un bouton "Download files" par exemple permettant de récupérer tous les fichiers modifiés. Par contre je n'ai pas trouvé de widget permettant de télécharger plusieurs fichiers en même temps, sur le même principe que le st.file_uploader avec un paramètre du genre accept_multiple_files=True. Si on ne peut télécharger qu'un seul fichier, alors que j'ai chargé et renommé plusieurs fichiers, c'est compliqué. Peut-être contourner le pb en zippant tous les fichiers, comme ça un seul fichier à télécharger? Est-ce possible de faire un fichier zip à partir de tous les fichiers chargés sur l'app?

Hello David,

effectivement avec streamlit tu ne peux pas download plusieurs fichiers d'un coup et ton idée de zipper tous les fichier pour n'en a voir qu'un est une bonne idée car c'est ce que la communauté streamlit recommande.

Tu peux faire un truc du genre:

from zipfile import ZipFile
import os
with ZipFile('sampleDir.zip', 'w') as zipObj:

   for filename in filenames:
       #create complete filepath of file in directory
       filePath = os.path.join(folderName, filename)
       # Add file to zip
             zipObj.write(filePath, basename(filePath))

Salut PA,
OK merci, j'ai réussi à bidouiller pour faire un fichier zip!

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.