9
votes

Comment exécuter un script Python sans spécifier l'extension de fichier (solution de plate-forme croisée)?

Disons que nous avons un script Python do.py et nous voulons pouvoir l'appeler sans extension, comme faire ou ./. / code>.

Si nous renommerons le fichier de do.py à faire et assurez-vous que nous avons une ligne Shebang valide, il fonctionnera pour toutes les plateformes mais Windows. Sous Windows, il n'y a aucun moyen d'exécuter un fichier sans extension.

sur Windows, si nous conservons l'extension de fichier d'origine, nous pourrons appeler le script sans le nom complet, car le programme d'installation Python enregistre l'extension .py comme exécutable.

Il semble que nous ayons besoin de livrer le même script sous deux noms différents afin d'appeler les environnements Windows et non Windows. Je n'aime vraiment pas ça et je cherche une solution sans cette redondance.

Une autre approche commune sur ceci consiste à ajouter un fichier do.cmd wrapper appelant le fichier d'origine do.py . Cela a au moins un problème majeur: il fait casse la pause Ctrl + C / CTRL + car il n'y a aucun moyen d'empêcher cmd.exe de vous inviter avec Terminez le travail de lots? (Y / N) message.

Si nous sommes sur le point d'utiliser une wrapper, nous devons être sûrs que:

  • renvoie le code d'erreur (errorLelve) renvoyé par le script d'origine
  • Il ne changera pas l'environnement
  • Il réutilisera la même console (pas de nouvelles fenêtres)
  • n'interfère pas avec stdout, stdin ou stardr
  • soyez sympathique avec Ctrl-C (aucune invite)

    Je suppose que la solution optimale est toujours d'utiliser une enveloppe. Le lot ne fonctionnera pas, l'exécutable indigène ajoutait beaucoup de complexité, donc probablement un wrapper écrivant dans Python lui-même ferait.


4 commentaires

Peut-être la réponse réside dans la question "Pourquoi vous voulez pouvoir l'appeler sans extension"?


Wow, quels sont beaucoup de travail pour aucun bénéfice réel. Quel est le problème avec do.py? C'est une plate-forme parfaitement transversale sans travail du tout.


Pour ceux qui se demandent: sans extension signifie que nous masquons les détails de la mise en œuvre: Par exemple, si l'année prochaine, je souhaite remplacer le script Python actuel avec un script Ruby, je ne veux pas être nécessaire de modifier tous les appels vers le script. Un autre argument moins important: moins à écrire de la ligne de commande.


sous Windows, si nous conservons l'extension de fichier d'origine, nous pourrons appeler le script sans le nom complet, car le programme d'installation Python enregistre l'extension .py comme exécutable one Pas vrai. L'enregistrement de l'extension ne permet pas d'appeler le script sans donner l'extension. Pour cela, vous devez également ajouter l'extension à la variable d'environnement Pathext AS ROMA suggérée.


6 Réponses :


0
votes

Vous pouvez toujours appeler votre script avec l'interprète Python. Vous obtenez la même cohérence dans * NIX, lorsque vous utilisez l'interprète.

windows xxx

* nix xxx p > Si ce n'est pas ce que vous voulez, alors je répète votre question.


1 commentaires

Ce n'est pas ce qu'il veut. Il veut l'exécuter comme tout autre exécutable dans le système - sans spécifier quoi que ce soit, mais le nom de l'exécutable (script) dans la ligne de commande.



1
votes

Vous pouvez utiliser des distutilles pour installer des scripts dans l'installation Python (l'outil Easy_install est installé comme celui-ci, par exemple).

Pour Windows, vous pouvez utiliser PY2EXE pour créer un script pouvant être exécuté sans extension de fichier . Sur Linux, vous pouvez simplement utiliser un fichier sans extension, mais y compris une ligne de shebang.


1 commentaires

Si vous installez le script, vous pouvez l'exécuter avec Python -M Modulename . C'est également une plate-forme inter-plate-forme.



2
votes

Jusqu'à présent, je suis venu avec cette solution qui semble fonctionner. Créez un fichier YourName.py avec ce contenu: xxx



5
votes

sur Windows J'ai ajouté l'extension ".py" à la variable d'environnement "pathext 'et qui fonctionne pour moi - si le fichier .PY est stocké dans un répertoire faisant partie de la variable d'environnement" PATH' ".

C:\>echo %PATHEXT%
.COM;.EXE;.BAT;.CMD;.PY;.JS;.JSE


2 commentaires

Cela a fonctionné pour moi dans les coquillages de commandement mais pour l'invite d'exécution, je devais ajouter une touche "Python_Script.exe" au registre - HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ App cheminées \ Puis défini la valeur par défaut sur mon python_script .Py Path, puis j'ai pu simplement taper "python_script" dans l'invite de course.


Mais comment cela fonctionne-t-il aussi sur les non-fenêtres? Puis-je taper faire sans l'extension?



4
votes

Écrivez votre module Python principal avec un .py extension. Configurer pathext correctement, et il fonctionnera sous Windows sans avoir à taper l'extension.

sur UNIX, écrivez un deuxième programme Python qui importe simplement le premier, en utilisant la syntaxe de She-Bang. Aucune extension sur ce fichier - c'est un script shell. Comme ceci: xxx

Ceci aura l'effet d'importer do.py .

seulement faire doit être marqué comme exécutable pour UNIX. do.py est un module dans cet environnement.

Lorsque vous importez un module, le code dans le module est exécuté une fois.

Ça ne Enlevez complètement la redondance, mais il est proche. Et c'est probablement la meilleure solution possible pour les scripts multiples-plate-forme.


1 commentaires

C'est une solution symétrique à celle donnée par OP mais c'est plus simple, semble donc être meilleure.



0
votes

La réponse de Jason est plus simple et plus simple, mais une version générique obtient le nom du module du nom de fichier:

#!/usr/bin/env python
import do


0 commentaires