Comment exécuter des scripts Python sous Windows?

91

J'ai un simple script blah.py (en utilisant Python 2):

import sys
print sys.argv[1]

Si j'exécute mon script par:

python c:/..../blah.py argument

Il affiche l'argument mais si j'exécute le script par:

blah.py argument

erreur se produit:

IndexError ...

Ainsi, les arguments ne passent pas au script.

python.exe dans PATH. Dossier avec blah.py également dans PATH.
python.exe est le programme par défaut pour exécuter les fichiers * .py.

Quel est le problème?

ton4eg
la source
3
publier un extrait de code peut nous aider à vous aider.
jldupont
L'homme sans boule de cristal a déjà donné une solution =) print sys.argv [1] produit cette erreur.
ton4eg
Si vous avez plusieurs versions de Python installées, vous aurez peut-être besoin de ce stackoverflow.com/questions/1934675/… .
laike9m
Dites manuellement à python d'exécuter mon script à partir du registre: "C: \ Python27 \ python.exe" "C: \ Python27 \ tpt.py" "% 1" `

Réponses:

144

Lorsque vous exécutez un script sans taper «python» à l'avant, vous devez savoir deux choses sur la façon dont Windows appelle le programme. Le premier est de savoir quel type de fichier Windows pense qu'il s'agit:

    C: \> assoc .py
    .py = Python.File

Ensuite, vous devez savoir comment Windows exécute les choses avec cette extension. Il est associé au type de fichier "Python.File", donc cette commande montre ce qu'il va faire:

    C: \> ftype Python.File
    Python.File = "c: \ python26 \ python.exe" "% 1"% *

Donc sur ma machine, quand je tape "blah.py foo", il exécutera cette commande exacte, sans différence de résultats que si j'avais tapé le truc complet moi-même:

    "c: \ python26 \ python.exe" "blah.py" toto

Si vous tapez la même chose, y compris les guillemets, vous obtiendrez des résultats identiques à ceux que vous venez de saisir "blah.py foo". Vous êtes maintenant en mesure de résoudre vous-même le reste de votre problème.

(Ou publiez des informations plus utiles dans votre question, comme de véritables copies copier-coller de ce que vous voyez dans la console. Notez que les personnes qui font ce type de chose obtiennent un vote pour leurs questions, et obtiennent des points de réputation, et davantage de personnes sont susceptibles de les aider avec de bonnes réponses.)

Apporté des commentaires:

Même si assoc et ftype affichent les informations correctes, il peut arriver que les arguments soient supprimés. Ce qui peut aider dans ce cas, c'est de corriger directement les clés de registre pertinentes pour Python. Met le

HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\command

la clé de:

"C:\Python26\python26.exe" "%1" %*

Probablement, auparavant, %*manquait. De même, définissez

 HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

à la même valeur. Voir http://eli.thegreenplace.net/2010/12/14/problem-passing-arguments-to-python-scripts-on-windows/

exemple de paramètre de registre pour python.exe HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\commandLe chemin d'accès au registre peut varier, utiliser python26.exeou python.exeou tout ce qui est déjà dans le registre.

entrez la description de l'image ici HKEY_CLASSES_ROOT\py_auto_file\shell\open\command

Peter Hansen
la source
30
Même si assocet ftypeafficher les informations correctes, il peut arriver que les arguments soient supprimés. Ce qui peut aider dans ce cas, c'est de corriger directement les clés de registre pertinentes pour Python. Définissez la HKEY_CLASSES_ROOT\Applications\python26.exe\shell\open\commandclé sur: "C:\Python26\python26.exe" "%1" %* Probablement, auparavant, %*manquait. De même, définissez HKEY_CLASSES_ROOT\py_auto_file\shell\open\commandla même valeur. Voir eli.thegreenplace.net/2010/12/14/…
parvus
5
@parvus Votre commentaire était la solution ultime pour moi. Même avec les associations lisant correctement, ces deux clés étaient toutes les deux mal définies.
Nathan Cox
1
J'ai également rencontré des problèmes avec HKEY_CLASSES_ROOT \ .py \ OpenWithProgids défini sur quelque chose de lié à VisualStudio, en particulier lorsque j'essaie d'exécuter des scripts Python dans mes tests AppVeyor. Voir help.appveyor.com/discussions/problems/… .
Jack O'Connor
1
J'ai un problème similaire. Anaconda par défaut a ajouté une clé de registre avec% * manquant
prasad
Dans Win10, j'écris test.py 123et je suis 123imprimé en tant que sys.argv[1]. Microsoft a-t-il changé quelque chose?
Hrvoje T
22

vous devez faire de l'application par défaut pour gérer les fichiers python python.exe.

faites un clic droit sur un fichier * .py, sélectionnez la boîte de dialogue "Ouvrir avec". Dans là, sélectionnez "python.exe" et cochez "toujours utiliser ce programme pour ce type de fichier" (quelque chose comme ça).

alors vos fichiers python seront toujours exécutés en utilisant python.exe

santosc
la source
16

De plus, si vous souhaitez pouvoir exécuter vos scripts python sans taper le .py(ou .pyw) à la fin du nom de fichier, vous devez ajouter .PY(ou .PY;.PYW) à la liste des extensions dans la variable d'environnement PATHEXT.

Sous Windows 7:

un clic droit sur l' ordinateur de
gauche cliquez sur Propriétés
gauche-cliquez sur Paramètres système avancés
gauche cliquez sur l'onglet Avancé
gauche sur Variables d' environnement ...
sous la rubrique « Variables système » défiler vers le bas jusqu'à ce que PATHEXT
clic gauche sur PATHEXT pour le sélectionner
laissé- cliquez sur Modifier ...
Modifiez la "valeur de la variable" pour qu'elle contienne ;.PY (la touche de fin sautera à la fin)
clic
gauche OK clic
gauche OK clic gauche OK

Remarque n ° 1: les fenêtres d'invite de commande ne verront pas le changement sans être fermé et rouvert.

Remarque n ° 2: la différence entre les extensions .pyet .pywest que la première ouvre une invite de commande lorsqu'elle est exécutée, et la seconde non.

Sur mon ordinateur, j'ai ajouté ;.PY;.PYWcomme dernières extensions (priorité la plus basse), donc les valeurs "avant" et "après" de PATHEXT étaient:

avant: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

après .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

Voici quelques commandes instructives:

C:\>echo %pathext%
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.PY;.PYW

C:\>assoc .py
.py=Python.File

C:\>ftype Python.File
Python.File="C:\Python32\python.exe" "%1" %*

C:\>assoc .pyw
.pyw=Python.NoConFile

C:\>ftype Python.NoConFile
Python.NoConFile="C:\Python32\pythonw.exe" "%1" %*

C:\>type c:\windows\helloworld.py
print("Hello, world!")  # always use a comma for direct address

C:\>helloworld
Hello, world!

C:\>
Dave Burton
la source
4

Comment exécuter des scripts Python sous Windows?

Vous pouvez installer pylauncher . Il est utilisé pour lancer les fichiers .py, .pyw, .pyc, .pyo et prend en charge plusieurs installations Python:

T\:> blah.py argument

Vous pouvez exécuter votre script Python sans spécifier l'extension .py si vous avez .py, .pyw dans la variable d'environnement PATHEXT:

T:\> blah argument

Il ajoute la prise en charge de shebang ( #!ligne d'en-tête) pour sélectionner la version Python souhaitée sous Windows si plusieurs versions sont installées. Vous pouvez utiliser une syntaxe compatible * nix #! /usr/bin/env python.

Vous pouvez spécifier la version explicitement, par exemple, pour exécuter avec la dernière version installée de Python 3:

T:\> py -3 blah.py argument

Cela devrait également résoudre votre sys.argvproblème en tant qu'effet secondaire.

jfs
la source
Python Launcher est en version bêta.
Nicolas Barbulesco
@NicolasBarbulesco: le lanceur Python est inclus dans Python 3.3, c'est-à-dire qu'il est assez bon
jfs
Peut être. Mais je n'ai pas réussi à installer Python 3 sur Windows . Peut-être pouvez-vous m'aider ici.
Nicolas Barbulesco
4

J'ai rencontré le même problème mais dans le contexte de la nécessité de conditionner mon code pour les utilisateurs Windows (provenant de Linux). Mon package contient un certain nombre de scripts avec des options de ligne de commande.

J'ai besoin que ces scripts soient installés à l'emplacement approprié sur les machines des utilisateurs Windows afin qu'ils puissent les appeler à partir de la ligne de commande. Comme le package est censé être convivial, demander à mes utilisateurs de modifier leur registre pour exécuter ces scripts serait impossible.

Je suis tombé sur une solution que les gens de Continuum utilisent pour les scripts Python fournis avec leur package Anaconda - consultez votre répertoire Anaconda / Scripts pour des exemples.

Pour un script Python test, créez deux fichiers: a test.batet a test-script.py.

test.batressemble à ceci (les .batfichiers en Anaconda\Scriptsappel python.exeavec un chemin relatif que j'ai adapté à mes besoins):

@echo off
set PYFILE=%~f0
set PYFILE=%PYFILE:~0,-4%-script.py
"python.exe" "%PYFILE%" %*

test-script.py est votre véritable script Python:

import sys
print sys.argv

Si vous laissez ces deux fichiers dans votre répertoire local, vous pouvez appeler votre script Python via le .batfichier en faisant

test.bat hello world
['C:\\...\\test-scripy.py', 'hello', 'world']

Si vous copiez les deux fichiers à un emplacement qui se trouve sur votre PATH(tel que Anaconda\Scripts), vous pouvez même appeler votre script en omettant le .batsuffixe

test hello world
['C:\\...Anaconda\\Scripts\\test-scripy.py', 'hello', 'world']

Avertissement: Je n'ai aucune idée de ce qui se passe et comment cela fonctionne et j'apprécierais donc toute explication.


la source
La création d'un .batwrapper pour chaque script Python est maladroite et redondante. Je ne recommanderais pas cela.
tripleee
2

Sous Windows ,

Pour exécuter un module python sans taper "python" ,

-> Cliquez avec le bouton droit sur n'importe quel fichier python (*. Py)

-> Définissez la propriété open with sur "python.exe"

-> Cochez la case "toujours utiliser ce programme pour ce type de fichier"

-> Ajoutez le chemin de python.exe à la variable d'environnement, par exemple, ajoutez C: \ Python27 à la variable d'environnement PATH.

Pour exécuter un module python sans taper l'extension ".py"

-> Editez la variable système PATHEXT et ajoutez l'extension ".PY" à la liste.

Aspak Rogatiya
la source
1

Vous avez trouvé une réponse incroyablement utile ici : Comment exécuter différentes versions de python dans cmd?

Je suggérerais d'utiliser l'utilitaire Python Launcher for Windows qui a été introduit dans Python 3.3 il y a quelque temps. Vous pouvez également le télécharger et l'installer manuellement directement à partir du site Web de l'auteur pour l'utiliser avec les versions antérieures de Python 2 et 3.

Indépendamment de la façon dont vous l'avez obtenu, après l'installation, il s'est associé à toutes les extensions de fichier Python standard (c'est-à-dire les fichiers .py, .pyw, .pyc et .pyo). Vous pourrez non seulement contrôler explicitement la version utilisée à l'invite de commande, mais également script par script en ajoutant des commentaires Linux / Unix-y shebang #! / Usr / bin / env pythonX au début de vos scripts Python.

Comme le suggère JF Sebastian, Python Launcher for Windows est le meilleur choix par défaut pour lancer différentes versions de Python dans Windows. Il s'agissait d'un outil tiers, mais il est maintenant officiellement pris en charge depuis Python 3.3.

Nouveau dans la version 3.3.

Le lanceur Python pour Windows est un utilitaire qui aide à l'emplacement et à l'exécution de différentes versions de Python. Il permet aux scripts (ou à la ligne de commande) d'indiquer une préférence pour une version spécifique de Python, et localisera et exécutera cette version.

C'est un excellent outil, utilisez-le!

laike9m
la source
0

Pouvez-vous exécuter python.exe à partir de n'importe quelle carte? Si vous ne le faites pas, vérifiez si vous avez des valeurs appropriées pour python.exe dans l'environnement PATH

Êtes-vous dans le même répertoire que blah.py. Vérifiez cela en émettant la commande -> éditez blah.py et vérifiez si vous pouvez ouvrir ce fichier

ÉDITER:

Dans ce cas, vous ne pouvez pas. ( python arg signifie que vous appelez python.exe avec certains paramètres que python suppose que c'est le nom de fichier du script que vous voulez exécuter)

Vous pouvez créer un fichier chauve-souris avec des lignes dans votre carte de chemin et exécuter le fichier .bat

Exemple:
dans l'une des cartes de chemin, créez le fichier blah.py.bat, modifiez le fichier et placez la ligne

python C:\Somedir\blah.py

Vous pouvez maintenant exécuter blah.py à partir de n'importe quel endroit, car vous n'avez pas besoin de mettre l'extension .bat lors de l'exécution de fichiers bat

Luka Rahne
la source
python dans PATH. Et répertoire qui contient blah.py également dans PATH. L'idée principale est d'exécuter le script python sans y écrire le chemin complet. Mais maintenant, j'ai des problèmes avec le passage des arguments.
ton4eg
3
Ralu, vous n'avez pas besoin d'un fichier batch pour exécuter un script python de cette façon. Utilisez la variable d'environnement PATHEXT pour inclure .py et .pyw en tant qu'extensions exécutables. Cette variable explique pourquoi vous n'avez pas non plus besoin de spécifier .bat.
Todd
0

Si c'est ce que j'ai compris, c'est comme ça:

C:\Users\(username)\AppData\Local\Programs\Python\Python(version)

COPY (ne pas supprimer) python.exe et renommer py.exe et exécuter:

py filename.py
Lucas Paz
la source
0

Exécutez simplement la commande:

C:>python .\file_name.py

En supposant que le nom du fichier se trouve dans le même dossier et que Python a déjà été ajouté aux variables d'environnement.

Mwiza
la source