尽管使用了 --hidden-import,但“docx”的 PyInstaller ModuleNotFoundError

PyInstaller ModuleNotFoundError for 'docx' Despite Using --hidden-import

提问人:Sir. wolf 提问时间:11/15/2023 更新时间:11/15/2023 访问量:41

问:

我希望只需双击可执行文件即可在 Windows 上运行我的 Python 脚本,而无需先安装 Python 或其他库。

我正在尝试使用 PyInstaller 从 Python 脚本创建一个独立的可执行文件。我的脚本使用“docx”和“pandas”库等。但是,当我运行PyInstaller生成的可执行文件时,我得到了“docx”模块的“ModuleNotFoundError”。

我使用以下 PyInstaller 命令生成可执行文件,包括“docx”模块的“--hidden-import”选项:

pyinstaller --noconfirm --onefile --windowed "C:/Users/nicol/Downloads/numero.py" --hidden-import docx

尽管如此,我在运行可执行文件时仍然收到错误。此外,构建日志中有几个关于缺少库的警告,我不确定这些警告是否与问题相关。

Traceback/Error Message:
When executing the .exe file, the following error appears:

回溯(最近一次调用最后一次): 文件“numero.py”,第 2 行,在 <module> ModuleNotFoundError:没有名为“docx”的模块

来自 PyInstaller 的警告:

在构建过程中,我还收到了几个警告:

Warnings written to C:\Users\nicol\AppData\Local\Temp\tmpacblyi50\build\numero\warn-numero.txt
129561 WARNING: Hidden import "pysqlite2" not found! ...

脚本概述:

以下是我的脚本代码的概述:

import pandas as pd
from docx import Document
import re
import sys
from PyQt5.QtWidgets import QApplication, QFileDialog, QDialog, QVBoxLayout, QTextEdit, QPushButton
import difflib

def get_file_path(caption, file_type):
    file_dialog = QFileDialog()
    file_path, _ = file_dialog.getOpenFileName(caption=caption, filter=file_type)
    return file_path

def load_excel_data(excel_path):
    try:
        return pd.read_excel(excel_path, sheet_name='Feuil1', header=0, names=['n°', 'nom de la pièce jointe', 'classeur', 'conclusion', 'Col5', 'Col6'])
    except Exception as e:
        QMessageBox.warning(None, "Erreur de chargement", f"Erreur lors du chargement du fichier Excel: {e}")
        sys.exit(1)

def update_word_document(word_path, df):
    updates = []  # Liste pour stocker les informations de mise à jour
    try:
        doc = Document(word_path)
        for paragraph in doc.paragraphs:
            match = re.search(r'pièce n° \d+', paragraph.text)
            if match:
                update_paragraph(paragraph, match, df, updates)
        return doc, updates
    except Exception as e:
        QMessageBox.warning(None, "Erreur de traitement", f"Erreur lors de la mise à jour du document Word: {e}")
        sys.exit(1)

def update_paragraph(paragraph, match, df, updates):
    old_piece_number = match.group()
    piece_info = paragraph.text.replace(old_piece_number, '').strip().strip('-').strip()
    new_piece_number = find_matching_piece_number(piece_info, df)
    if new_piece_number:
        new_text = paragraph.text.replace(old_piece_number, f"pièce n° {new_piece_number}")
        updates.append(f"Mise à jour: '{paragraph.text}' à '{new_text}'")
        paragraph.text = new_text


def find_matching_piece_number(piece_info, df):
    # Assurez-vous que piece_info est une chaîne
    piece_info = str(piece_info).lower()

    # Créer une liste de noms de pièces jointes en tant que chaînes
    piece_names = df['nom de la pièce jointe'].apply(lambda x: str(x).lower())

    # Chercher la meilleure correspondance possible
    best_match = difflib.get_close_matches(piece_info, piece_names, n=1, cutoff=0.6)
    if best_match:
        matching_row = df[piece_names == best_match[0]]
        if not matching_row.empty:
            return matching_row.iloc[0]['n°']
    return None

def display_updates(updates):
    dialog = QDialog()
    dialog.setWindowTitle("Mises à jour effectuées")
    dialog.setModal(True)  # Rendre le dialogue modal
    layout = QVBoxLayout()

    text_edit = QTextEdit()
    text_edit.setReadOnly(True)
    text_edit.setText("\n".join(updates))
    layout.addWidget(text_edit)

    close_button = QPushButton("Fermer")
    close_button.clicked.connect(dialog.close)
    layout.addWidget(close_button)

    dialog.setLayout(layout)
    dialog.exec_()  # Exécuter en tant que dialogue modal
    QApplication.instance().quit()  # Fermer l'application une fois le dialogue fermé

def main():
    excel_path = get_file_path("Sélectionnez le fichier Excel", "Excel Files (*.xlsx)")
    word_path = get_file_path("Sélectionnez le fichier Word", "Word Files (*.docx)")
    df = load_excel_data(excel_path)
    doc, updates = update_word_document(word_path, df)
    save_path = get_file_path("Sélectionnez l'emplacement de sauvegarde", "Word Files (*.docx)")
    doc.save(save_path)
    
    # Afficher les mises à jour dans une boîte de dialogue
    if updates:
        display_updates(updates)
    else:
        QMessageBox.information(None, "Aucune mise à jour", "Aucune modification n'a été apportée au document.")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setQuitOnLastWindowClosed(True)  # S'assurer que l'application se termine avec la dernière fenêtre
    main()
python pyinstaller exe docx

评论


答: 暂无答案