2017-08-19 1 views
0

J'essaie d'exécuter la commande ci-dessous en utilisant le sous-processus python, mais il échoue.Sous-processus python check_output

S'il vous plaît aider

import subprocess 
    cmd = "bash /opt/health_check -t 2>/dev/null" 
    retcode = subprocess.call([cmd]) 
    print retcode 

Je reçois ci-dessous sortie:

Traceback (most recent call last): 
    File "./script.py", line 65, in <module> 
    retcode = subprocess.call([cmd]) 
    File "/usr/lib64/python2.7/subprocess.py", line 522, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib64/python2.7/subprocess.py", line 710, in __init__ 
    errread, errwrite) 
    File "/usr/lib64/python2.7/subprocess.py", line 1335, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

Répondre

0

Si vous appelez check_output une liste , vous devez tokenizer la commande vous-même, comme dans:

import subprocess 
cmd = ["bash", "/opt/health_check", "-t"] 
retcode = subprocess.call([cmd]) 
print retcode 

Cela n'utilise pas de shell, vous ne pouvez donc pas utiliser la redirection d'entrée. Si vous voulez vraiment exécuter votre commande avec un shell, puis passez une chaîne et définir shell=True:

import subprocess 
cmd = "bash /opt/health_check -t 2>/dev/null" 
retcode = subprocess.call(cmd, shell=True) 
print retcode 
+0

Ou commencer par une liste avant la main, ou d'essayer en utilisant 'shlex.split()' sur la première chaîne ... –

0

Ceci est une mauvaise façon d'appeler subprocess. Une façon rapide et sale de le faire est de changer comme:

subprocess.call(cmd, shell=True) 

Cela invoquera le shell du système pour exécuter la commande, et vous aurez accès à tous les goodies qu'il fournit. Ce n'est pas quelque chose à utiliser légérement, cependant, vérifiez security considerations des docs avant de le faire.

Sinon, vous pouvez simplement fournir la commande comme une liste, comme suit:

subprocess.call(["bash", "/opt/health_check"])