À l'aide de sous-processus pour exécuter un script Python sur Windows
Est-il un moyen simple d'exécuter un script Python sur Windows/Linux/OS X?
Sur les deux derniers, subprocess.Popen("/the/script.py")
fonctionne, mais sur Windows j'obtiens l'erreur suivante:
Traceback (most recent call last):
File "test_functional.py", line 91, in test_functional
log = tvnamerifiy(tmp)
File "test_functional.py", line 49, in tvnamerifiy
stdout = PIPE
File "C:\Python26\lib\subprocess.py", line 595, in __init__
errread, errwrite)
File "C:\Python26\lib\subprocess.py", line 804, in _execute_child
startupinfo)
WindowsError: [Error 193] %1 is not a valid Win32 application
monkut de l' commentaire: Le cas d'utilisation n'est pas claire. Pourquoi utiliser des sous-processus pour exécuter un script python? Est-il quelque chose vous empêche d'importer le script et l'appel de la fonction nécessaire?
J'ai écrit un script vite fait pour tester l'ensemble des fonctionnalités de Python-outil de ligne de commande (à tester sur différentes plates-formes). Fondamentalement, il fallait créer un ensemble de fichiers dans un dossier temp, exécutez le script de cette et de vérifier les fichiers ont été renommés correctement.
Je pourrait avoir importé le script et a appelé la fonction, mais depuis elle s'appuie sur sys.argv
et utilise sys.exit()
, j'aurais besoin de faire quelque chose comme..
import sys
import tvnamer
sys.argv.append("-b", "/the/folder")
try:
tvnamer.main()
except BaseException, errormsg:
print type(errormsg)
Aussi, je voulais capturer le stdout et stderr pour le débogage au cas où quelque chose s'est mal passé.
Bien sûr une meilleure façon serait d'écrire le script en plus de l'unité-testable, mais le script est fondamentalement "fait" et je suis en train de faire un dernier lot de tester avant de faire un "1.0" libération (après quoi, je vais faire une réécriture/restructurer, ce qui sera beaucoup plus propre et plus testable)
Fondamentalement, il était beaucoup plus facile de simplement exécuter le script comme un processus, après la recherche de la sys.executable
variable. Je l'ai écrit comme un shell-script, mais cela n'aurait pas été de la croix-plate-forme. Le script final peut être trouvé ici
- Le cas d'utilisation n'est pas claire. Pourquoi utiliser des sous-processus pour exécuter un script python? Est-il quelque chose vous empêche d'importer le script et l'appel de la fonction nécessaire?
- Eu le même problème lors de l'exécution de nodejs modules de python. sous-processus.appel([r'..\nodejs\mnp'], shell=True) a résolu le problème.
Vous devez vous connecter pour publier un commentaire.
Viens de trouver
sys.exécutable
- le chemin d'accès complet à l'actuel Python exécutable, qui peut être utilisé pour exécuter le script (au lieu de compter sur la shbang, ce qui évidemment ne fonctionne pas sur Windows)subprocess.check_call([sys.executable, "myscript.py"])
à la place.subprocess.run
:subprocess.run([sys.executable, 'myscript.py'], check=True)
Comment à ce sujet:
Cela dit
subprocess
à utiliser le système d'exploitation shell pour ouvrir votre script, et travaille sur quelque chose que vous pouvez juste lancer dans cmd.exe.En outre, cela permettra de rechercher le CHEMIN pour "myscript.py" - qui pourrait être souhaitable.
Oui
subprocess.Popen(cmd, ..., shell=True)
fonctionne comme un charme. Sous Windows, le.py
extension de fichier est reconnu, de sorte que Python est appelé à traiter (sur *NIX simplement l'habitude shebang). Le chemin d'accès de l'environnement de contrôle si les choses sont vues. Donc, la première arg àPopen
est juste le nom du script.shell=True # do not show the command prompt then true, if false show it
Il ressemble à windows tente d'exécuter le script à l'aide de ses propres EXE cadre plutôt que de l'appeler comme
Essayer,
Edit: "python" aurait besoin d'être sur votre chemin.
Vous utilisez un chemin d'accès séparateur, qui est dépendant de la plate-forme. Windows utilise "\" et Unix utilise "/".
Par exemple, pour exécuter la suite avec l'invite de commande ou un fichier de commandes, nous pouvons utiliser ce:
Même chose à faire avec Python, on peut faire ceci:
ou
Lorsque vous exécutez un script python sur windows en sous-processus, vous devez utiliser python en face du nom du script. Essayez: