Je pense à quelque chose du genre du module webbrowser, mais pour les navigateurs de fichiers. Sous Windows, je voudrais ouvrir l'explorateur, sous GNOME sur Linux je veux ouvrir nautilus, Konqueror sur KDE, etc. Je préférerais ne pas bricoler si je peux l'éviter. ;-)
Réponses
Trop de publicités?Je préférerais ne pas bricoler si je peux l'éviter.
Eh bien, je pense que vous allez avoir besoin d'un peu de bricolage de détection de plateforme, mais espérons pas autant que le module de détection de commande épouvantable webbrowser
. Voici une première tentative :
if sys.platform=='win32':
subprocess.Popen(['start', d], shell= True)
elif sys.platform=='darwin':
subprocess.Popen(['open', d])
else:
try:
subprocess.Popen(['xdg-open', d])
except OSError:
# er, trouvez autre chose à essayer
# xdg-open *devrait* être pris en charge par des versions récentes de Gnome, KDE, Xfce
Remarquez que la version win32 échouera actuellement pour les espaces dans les noms de fichiers. Le bug 2304 pourrait être lié à cela, mais il semble y avoir un problème de base avec l'échappement des paramètres et le shell Windows (cmd /c ...
), puisque vous ne pouvez pas imbriquer de guillemets doubles et vous ne pouvez pas échapper les guillemets ou les espaces avec ^. Je n'ai pas réussi à trouver de moyen de mettre entre guillemets et d'exécuter cmd /c start C:\Documents and Settings
depuis la ligne de commande du tout.
ETA par rapport au commentaire de nosklo : sur Windows uniquement, il y a un moyen intégré de le faire :
if sys.platform=='win32':
os.startfile(d)
Voici la solution alternative pas très agréable pour trouver le shell et ouvrir un dossier avec, que vous ne devriez plus avoir besoin maintenant, mais je laisserai quand même. (En partie parce que cela pourrait être utile pour autre chose, mais surtout parce que j'ai passé du temps à taper la foutue chose !)
if sys.platform=='win32':
import _winreg
path= r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon')
for root in (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE):
try:
with _winreg.OpenKey(root, path) as k:
value, regtype= _winreg.QueryValueEx(k, 'Shell')
except WindowsError:
pass
else:
if regtype in (_winreg.REG_SZ, _winreg.REG_EXPAND_SZ):
shell= value
break
else:
shell= 'Explorer.exe'
subprocess.Popen([shell, d])
Vous pouvez le faire avec la bibliothèque Tkinter intégrée à Python. Essayez ce qui suit :
import Tkinter
from tkFileDialog import askopenfilename
root = Tkinter.Tk()
root.withdraw() # masquer la fenêtre principale de l'interface graphique pour notre exemple
filename = askopenfilename()
Si l'utilisateur ne choisit pas de fichier, la variable filename sera None; sinon, elle contiendra le chemin + le nom du fichier.
Consultez davantage sur tkFileDialog ici.
Je suis tombé sur ce post avec un problème similaire Choisir un fichier en Python avec une boîte de dialogue simple. Je recommande d'y aller pour des exemples et des snippets de code. Fondamentalement, 2 suggestions ont été offertes:
- Utiliser tkinter: qui semble compatible avec macOS et Windows, est également très courant donc il y a beaucoup d'articles à ce sujet.
- Utiliser plyer: Semble être une bibliothèque plus récente et le degré de support dans différents OS varie significativement.
Je recommanderais d'essayer d'abord tkinter, puis si cela échoue, d'essayer une des alternatives.
Étant donné que ce fil de discussion est très vieux, il est probablement utile de partager des alternatives plus récentes qui ont pu apparaître récemment pour d'autres personnes cherchant des réponses à la même question.
C'est vraiment une tentative au hasard, mais jetez un œil à wxPython qui fournit des liaisons Python à la bibliothèque sous-jacente wxWidgets. Cela fait longtemps que je n'y ai pas jeté un œil, mais il pourrait y avoir quelque chose que vous pouvez utiliser. Sinon, il devrait être relativement facile de créer votre propre explorateur de fichiers qui utilisera les "widgets" natifs de chaque système d'exploitation.
À noter que wxPython n'est pas léger, il alourdira vraiment votre application et augmentera vos dépendances.
Je ne sais pas si un module prêt à l'emploi existe, mais s'il existe, il devrait se trouver sur le cookbook Python d'Activestate (http://code.activestate.com/recipes/langs/python/)
Aussi, au moins dans gnome et sur mac os, vous pouvez exécuter "gnome-open http://blah" et "open http://blah" (sur mac); les deux ouvriront l'URL dans le navigateur préféré de l'utilisateur.
Pour Linux, vérifiez également freedesktop.org -- un ensemble commun d'outils couvrant à la fois Gnome et KDE, qui devrait inclure quelque chose de similaire.