Bonjour,
Je cherche à obtenir le chemin d'accès de l'exécutable qui ouvre un fichier en se basant sur l'extension (Je suis sous Windows). Par exemple:
J'ai actuellement un code (un peu indigeste je reconnais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 app_path = get_app_path('.txt') >>> r'chemin\vers\notepad.exe') qui fonctionne mais pas parfaitement, certaines application ne fonctionnent pas
RESULAT:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 import os import shlex import winreg import logging # Configure logging logging.basicConfig(level=logging.DEBUG, format='%(levelname)s: %(message)s') def get_app_path(ext): # Attempt to retrieve from UserChoice try: with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{}\UserChoice'.format(ext)) as key: progid = winreg.QueryValueEx(key, 'ProgId')[0] with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'SOFTWARE\Classes\{}\shell\open\command'.format(progid)) as key: path = winreg.QueryValueEx(key, '')[0] return clean_path(path) except FileNotFoundError as e: logging.debug(f"UserChoice lookup failed for {ext}: {e}") # Try HKEY_CLASSES_ROOT try: class_root = winreg.QueryValue(winreg.HKEY_CLASSES_ROOT, ext) if class_root: with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r'{}\shell\open\command'.format(class_root)) as key: path = winreg.QueryValueEx(key, '')[0] return clean_path(path) except FileNotFoundError as e: logging.debug(f"HKEY_CLASSES_ROOT lookup failed for {ext}: {e}") # Try HKEY_LOCAL_MACHINE try: with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r'SOFTWARE\Classes\{}\shell\open\command'.format(ext)) as key: path = winreg.QueryValueEx(key, '')[0] return clean_path(path) except FileNotFoundError as e: logging.debug(f"HKEY_LOCAL_MACHINE lookup failed for {ext}: {e}") # Try OpenWithProgids try: with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r'{}\OpenWithProgids'.format(ext)) as key: progid = winreg.EnumValue(key, 0)[0] with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r'{}\shell\open\command'.format(progid)) as key: path = winreg.QueryValueEx(key, '')[0] return clean_path(path) except FileNotFoundError as e: logging.debug(f"OpenWithProgids lookup failed for {ext}: {e}") # Try OpenWithList try: with winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{}\OpenWithList'.format(ext)) as key: progid = winreg.EnumValue(key, 0)[0] with winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r'{}\shell\open\command'.format(progid)) as key: path = winreg.QueryValueEx(key, '')[0] return clean_path(path) except FileNotFoundError as e: logging.debug(f"OpenWithList lookup failed for {ext}: {e}") # If no path is found, return None return None def clean_path(path): path = os.path.expandvars(path) path = shlex.split(path, posix=False)[0] return path.strip('"') # Extensions to check (examples) extensions = ['.txt', '.pdf', '.jpg', '.png', '.pptx', '.py', '.svg', '.php'] # Print the associated program for each extension for extension in extensions: app_path = get_app_path(extension) print(f'Extension: {extension}, Program: {app_path}')
RESULTAT (logs):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Extension: .txt, Program: C:\Program Files\WindowsApps\Microsoft.WindowsNotepad_11.2501.31.0_x64__8wekyb3d8bbwe\Notepad\Notepad.exe Extension: .pdf, Program: C:\Users\...\AppData\Local\Programs\Opera\opera.exe Extension: .jpg, Program: None Extension: .png, Program: None Extension: .pptx, Program: C:\Program Files\Microsoft Office\Root\Office16\POWERPNT.EXE Extension: .py, Program: C:\Users\...\AppData\Local\Programs\Python\Launcher\py.exe Extension: .svg, Program: C:\Program Files\Inkscape\bin\inkscape.exe Extension: .php, Program: C:\Users\...\AppData\Local\Programs\Microsoft VS Code\Code.exe
IMPORTANT:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DEBUG: UserChoice lookup failed for .jpg: [WinError 2] Le fichier spécifié est introuvable DEBUG: HKEY_CLASSES_ROOT lookup failed for .jpg: [WinError 2] Le fichier spécifié est introuvable DEBUG: HKEY_LOCAL_MACHINE lookup failed for .jpg: [WinError 2] Le fichier spécifié est introuvable DEBUG: OpenWithProgids lookup failed for .jpg: [WinError 2] Le fichier spécifié est introuvable DEBUG: OpenWithList lookup failed for .jpg: [WinError 2] Le fichier spécifié est introuvable DEBUG: UserChoice lookup failed for .png: [WinError 2] Le fichier spécifié est introuvable DEBUG: HKEY_CLASSES_ROOT lookup failed for .png: [WinError 2] Le fichier spécifié est introuvable DEBUG: HKEY_LOCAL_MACHINE lookup failed for .png: [WinError 2] Le fichier spécifié est introuvable DEBUG: OpenWithProgids lookup failed for .png: [WinError 2] Le fichier spécifié est introuvable DEBUG: OpenWithList lookup failed for .png: [WinError 2] Le fichier spécifié est introuvable DEBUG: UserChoice lookup failed for .pptx: [WinError 2] Le fichier spécifié est introuvable DEBUG: UserChoice lookup failed for .py: [WinError 2] Le fichier spécifié est introuvable DEBUG: UserChoice lookup failed for .php: [WinError 2] Le fichier spécifié est introuvable DEBUG: HKEY_LOCAL_MACHINE lookup failed for .php: [WinError 2] Le fichier spécifié est introuvable
Le code ci-dessus provient de diverses sources (autres forums, IA génératives, etc...), elles ont été bien pratiques mais malheureusement insuffisantes, d'où ce post.
Merci par avance de vos réponses
Dymon







Répondre avec citation
Partager