2012-04-03 5 views
6

Existe-t-il un moyen portable d'exécuter un script Python à partir d'un shell sans écrire son chemin complet?Comment faire pour exécuter un script Python sans spécifier son chemin d'accès complet

Par exemple sous Linux, je voudrais alors que dans mon répertoire

cd ~ 

pour être en mesure d'exécuter un script python appelé run.py qui est en dire, ~/long/chemin/vers/run py, mais je veux le lancer en tapant simplement

python run.py 

au lieu de

python ~/long/path/to/run.py 

J'espérer une sorte de soi liste de chemins d'accès à l'arc qui contient plusieurs répertoires, tout comme la variable PATH, de sorte que python run.py exécute le premier run.py qu'il rencontre dans l'un des répertoires.

J'ai envisagé de transformer run.py en un exécutable et d'ajouter son répertoire à la variable PATH du système, mais je n'ai pas trouvé de manière portable de rendre un script python exécutable.

EDIT

Un an plus tard, après avoir demandé, je suis un peu moins noob, et je vois que ma question n'a pas été très claire et n'a pas beaucoup de sens, donc après une question que je vais upvote clarifier certaines choses.

1) Portable.

Lorsque j'ai demandé cela, j'ai dit portable. Cependant, les moyens portables ne sont pas clairs dans ce cas, et je n'y ai pas beaucoup insisté.

  • les plates-formes: devrait fonctionner sur POSIX (Linux, MacOS, etc.) et Windows

  • cela ne fonctionne toujours pas beaucoup de sens car Windows utilise cmd.exe, et utilise POSIX sh, pour que chacun pourrait exécutez les commandes avec une syntaxe différente. Alors disons que la chose la plus portable possible serait de nourrir la même entrée à la fois sh et cmd.exe, exécutant le script python dans les deux cas. Dans ce cas, vous pouvez exécuter la même commande à partir d'une fonction ANSI C system, qui utilise sh sur POSIX et cmd sous Windows. ANSI C étant l'une des rares choses communes à Windows et POSIX, la question a du sens dans ce cas.

2) Executable

Ensuite, l'expression turning run.py into an executable, n'est pas très clair. Par ce que je parlais de la stratégie Linux de chmod +x run.py, ajouter un shebang #!/usr/bin/env python, et en ajoutant son répertoire le système ajouter ~/long/chemin/à/la variable d'environnement PATH. Mais cela ne fonctionnera pas pour Windows car Windows ne supporte pas une propriété de métadonnées de fichier exécutable comme Linux et parce que/usr/bin/env n'existe pas forcément dans Windows.

3) Extension

Enfin, dans ma tête, j'espérait une solution qui ne précise pas quel type de fichier exécuter est, de sorte que si un jour nous décidons de le faire, par exemple, un fichier perl, pas les interfaces changeraient.

Par conséquent, écrire run.py serait mauvais car il spécifierait le type de fichier; il serait préférable de pouvoir écrire juste run

Répondre

14

Si le répertoire contenant run.py est sur le chemin de recherche de module (par exemple, variable d'environnement PYTHONPATH), vous devriez être en mesure de l'exécuter comme ceci:

python -m run 

Voici la documentation sur la ligne de commande -m Option:

-mmodule-name
recherches sys.path pour le module nommé et exécute le fichier .py correspondant en tant que script.

+0

Merci FJ, c'est exactement ce que je cherchais, je le sens a deux avantages sur le '#!' approche: 2 –

+0

(spécifique Désolé, commentaire à moitié terminé) ... Merci F.J, c'est ce que je cherchais, je pense qu'il a deux avantages sur le '#!' approche: 1) pas encombrer les scripts 2) pas encombrer la variable globale PATH, et en utilisant le plus spécifique PYTHONPATH à la place. L'inconvénient est bien sûr d'avoir à taper "python -m" tout le temps, ce qui prend de l'espace et pire, pourrait signifier de réécrire du code si jamais vous décidez un jour de transformer vos scripts python en scripts, par exemple. –

+0

J'ai essayé python -m run mais ça n'a pas fonctionné ... Je suis sûr que run.py est dans le PYTHONPATH puisque je peux l'importer et ça se voit quand j'importe le sys; print sys.path ... ai-je oublié quelque chose? –

4

Vous pouvez faire un script exécutable python en ajoutant

#!/usr/bin/env python 

au début du fichier, et le rendre exécutable avec chmod +x.

+0

Merci alberge, je n'étais pas sûr que cela fonctionne sur Windows, mais il semble que #!/Usr/bin/env python sera traité comme un commentaire, et l'installation python associe automatiquement les fichiers .py avec l'interpréteur python. C'est particulièrement génial si vous mettez .py dans votre EXTPATH, donc vous pouvez exécuter des fichiers python simplement en tapant "run" au lieu de "run.py", ce qui signifie que si vous décidez de transformer vos scripts python en say, Perl, vous n'aurez pas besoin de réécrire les appels de script. Ce serait génial s'il y avait un moyen simple d'exécuter des scripts sous Linux sans écrire l'extension et sans ajouter #! ... –

+0

Cela fonctionne très bien avec virtualenv – Henrik

0
  1. Marque fichier exécutable python (comme "Alberge" indiqué ci-dessus)
  2. Créer un répertoire et de mettre ce répertoire dans votre variable PATH
  3. Dans ce répertoire, créez des liens vers vos scripts python
1

réponse après la modification de clarification

Je préfère les suivantes approche de celle suggérée par @ F.J. car les utilisateurs n'ont pas besoin de spécifier le type de fichier. Veuillez noter que ceci n'a pas été spécifié dans la question originale, donc sa réponse à la question originale était correcte. Appelons le fichier pytest.py pour éviter les conflits avec un programme existant run existant.

Sur POSIX (MacOs, Linux) faire ce que dit @Petr, qui est basé sur ce que @alberge dit:

  • chmod +x
  • ajouter tralala #!/usr/bin/env python
  • créer un répertoire et l'ajouter au chemin . endroits habituels sur Linux sont: ~/bin/pour un seul utilisateur, /usr/local/bin/ pour tous les utilisateurs
  • symlink (cp -s) le fichier sous votre chemin avec basename pytest au lieu de pytest.py

Sur les fenêtres:

  • créez un répertoire et ajoutez-le à PATH. AFAIK, il n'y a pas d'endroit conventionnel pour cela, alors pourquoi pas C:\bin\ et ~\bin\?
  • ajouter .PY à la variable d'environnement PATHEXT afin que Windows reconnaît les fichiers avec l'extension python sous forme de fichiers exécutables sans vous obliger à taper l'extension
  • associés fichiers python avec le droit interpréteur python.exe (Explorateur Windows> cliquez sur> cochez la case « Toujours utiliser le programme sélectionné "). Il y a une option sur l'installateur python qui le fait pour vous.
  • symlink pytestavec extension dans le répertoire sous PATH (avec lien Shell Extension à partir de Windows Explorer ou mklink name dest de cmd)

Maintenant system("pytest"); devrait fonctionner dans les deux systèmes (sh sous Linux, cmd sous Windows)

Questions connexes