提问人:Sir. wolf 提问时间:11/15/2023 更新时间:11/15/2023 访问量:41
尽管使用了 --hidden-import,但“docx”的 PyInstaller ModuleNotFoundError
PyInstaller ModuleNotFoundError for 'docx' Despite Using --hidden-import
问:
我希望只需双击可执行文件即可在 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()
答: 暂无答案
评论