web-dev-qa-db-fra.com

OSError: [WinError 193]% 1 n'est pas une application Win32 valide.

J'essaie d'appeler un fichier python "hello.py" à partir de l'interpréteur python avec sous-processus. Mais je suis incapable de résoudre cette erreur. [Python 3.4.1]. 

import subprocess    
subprocess.call(['hello.py', 'htmlfilename.htm'])
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    subprocess.call(['hello.py', 'htmlfilename.htm'])
  File "C:\Python34\lib\subprocess.py", line 537, in call
    with Popen(*popenargs, **kwargs) as p:
  File "C:\Python34\lib\subprocess.py", line 858, in __init__
    restore_signals, start_new_session)
  File "C:\Python34\lib\subprocess.py", line 1111, in _execute_child
    startupinfo)
OSError: [WinError 193] %1 is not a valid Win32 application

Existe-t-il également un autre moyen "d'appeler un script python avec des arguments" autrement qu'en utilisant un sous-processus? Merci d'avance.

23
Caxton

L'erreur est assez claire. Le fichier hello.py n'est pas un fichier exécutable. Vous devez spécifier l'exécutable:

subprocess.call(['python.exe', 'hello.py', 'htmlfilename.htm'])

Vous aurez besoin de python.exe pour être visible dans le chemin de recherche ou vous pouvez transmettre le chemin complet au fichier exécutable qui exécute le script d'appel:

import sys
subprocess.call([sys.executable, 'hello.py', 'htmlfilename.htm'])
23
David Heffernan

Les installateurs Python enregistrent généralement les fichiers .py avec le système. Si vous exécutez le shell explicitement, cela fonctionne:

import subprocess
subprocess.call(['hello.py', 'htmlfilename.htm'], Shell=True)
# --- or ----
subprocess.call('hello.py htmlfilename.htm', Shell=True)

Vous pouvez vérifier vos associations de fichiers sur la ligne de commande avec

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

C:\>ftype Python.File
Python.File="C:\Python27\python.exe" "%1" %*
7
tdelaney

J'ai eu la même erreur alors que j'avais oublié d'utiliser Shell=True dans le subprocess.call.

subprocess.call('python modify_depth_images.py', Shell=True)

Exécuter une commande externe

Pour exécuter une commande externe sans interagir avec elle, telle qu'une ferait avec os.system (), utilisez la fonction call ().

sous-processus d'importation

Commande simple subprocess.call (['ls', '-1'], Shell = True)

1
Mona Jalal

J'ai aussi vécu cette erreur. Ensuite, j'installe le package de Visual Studio 2015 Redistribution via ce lien. Problème résolu:). Essayez-le avant de faire d'autres modifications.

0