web-dev-qa-db-fra.com

Exécuter un script shell à partir de python avec une variable

J'ai ce code:

opts.info("Started domain %s (id=%d)" % (dom, domid))

Je souhaite exécuter un script Shell avec le paramètre domid ci-dessus ..__

subprocess.call(['test.sh %d', domid])

Comment ça marche?

Je l'ai essayé avec:

subprocess.call(['test.sh', domid])

Mais je reçois cette erreur:

File "/usr/lib/xen-4.1/bin/xm", line 8, in <module>
    main.main(sys.argv)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 3983, in main
    _, rc = _run_cmd(cmd, cmd_name, args)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 4007, in _run_cmd
    return True, cmd(args)
  File "<string>", line 1, in <lambda>
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/main.py", line 1519, in xm_importcommand
    cmd.main([command] + args)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/create.py", line 1562, in main
    dom = make_domain(opts, config)
  File "/usr/lib/xen-4.1/bin/../lib/python/xen/xm/create.py", line 1458, in make_domain
    subprocess.call(['test.sh', domid])
  File "/usr/lib/python2.7/subprocess.py", line 493, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
TypeError: execv() arg 2 must contain only strings
10
Vince

Comme ça ?

subprocess.call(['test.sh', str(domid)])

La documentation est disponible sur le site de python

15
Paco

Vince,

Je cherchais aussi à faire la même chose que ce post. Exécuter un script shell à partir de python avec variable (avec variable, je pense que cela signifie avec un argument en ligne de commande). 

J'ai fait ce qui suit pour obtenir les résultats. Je partage au cas où d'autres personnes cherchent la même réponse.

 import os 
 arglist = 'arg1 arg2 arg3' 
 bashCommand = "/ bin/bash script.sh" + liste_éclair 
 os.system (bashCommand) 

qui a bien fonctionné pour moi.

J'ai également, après plus de lecture, suggéré qu'il serait préférable d'utiliser subprocess.Popen si vous souhaitez récupérer les résultats à des fins d'affichage. Je connecte tout dans un autre fichier avec le script bash, je n'ai donc pas vraiment besoin de sous-processus.

J'espère que ça aide.

 import os 
 os.system ("cat /root/test.sh")
 #!/bin/bash 
 x = '1' 
 tandis que [[$ x -le 10]]; faire
 echo $ x: hello $ 1 $ 2 $ 3 
 dormir 1 
 x = $ (($ x + 1)) 
 terminé

 arglist = 'arg1 arg2 arg3' 
 bashCommand = 'bash /root/test.sh' + liste_glish 
 os.system (bashCommand) 
 1: bonjour arg1 arg2 arg3 
 2: bonjour arg1 arg2 arg3 
 3: bonjour arg1 arg2 arg3 
 4: bonjour arg1 arg2 arg3 
 5: bonjour arg1 arg2 arg3 
3
Murtaza Pitalwala

Une solution simple à retenir:

import os
bashCommand = "source script.sh"
os.system(bashCommand)
2
LearnOPhile

Vous devez appeler le script Shell de la manière suivante à partir de votre script Python:

subprocess.call(['test.sh', domid])

Reportez-vous à ici pour la documentation du module de sous-processus. Dans le script ci-dessus, nous passons une liste à la méthode call où le premier élément est le programme à exécuter et les éléments restants dans la liste sont les arguments du programme.

0
Prahalad Deshpande