2014-06-30 1 views
0

Je voudrais exécuter un exe à partir de ce répertoire:/home/pi/pi_sensors-master/bin/Release/ Cet exe est ensuite exécuté en attachant mono i2c.exe et ça fonctionne bien.flux de données python subprocess.check_output exe d'un autre emplacement

Je voudrais obtenir cette sortie en python qui se trouve dans un répertoire complètement différent.

Je sais que je devrais utiliser subprocess.check_output pour prendre la sortie sous forme de chaîne.

J'ai essayé de mettre en œuvre ce en python:

import subprocess 
import os 


cmd = "/home/pi/pi_sensors-master/bin/Release/" 
os.chdir(cmd) 
process=subprocess.check_output(['mono i2c.exe']) 
print process 

Cependant, j'ai reçu cette erreur: enter image description here

La sortie serait généralement un flux de données avec un nouveau numéro à chaque fois, est-il possible capturer cette sortie et la stocker comme une variable en constante évolution?

Toute aide serait grandement appréciée.

+0

'i2c.exe'-t mono sudo du travail terminal? – msvalkon

+0

oui cela fonctionne – Hamoudy

+0

voici la sortie du terminal: http://prntscr.com/3xy211 – Hamoudy

Répondre

2

Votre syntaxe de commande est incorrecte, ce qui génère l'exception. Vous voulez appeler mono i2c.exe, de sorte que votre liste de commande devrait ressembler à:

subprocess.check_output(['mono', 'i2c.exe']) # Notice the comma separation. 

Effectuez les opérations suivantes:

import subprocess 
import os 

executable = "/home/pi/pi_sensors-master/bin/Release/i2c.exe" 

print subprocess.check_output(['mono', executable]) 

Le sudo est pas un problème aussi longtemps que vous donnez le chemin complet vers le fichier et vous êtes sûr que l'exécution de la commande mono fonctionne comme sudo.

je peux générer la même erreur en faisant une ls -l:

>>> subprocess.check_output(['ls -l']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/subprocess.py", line 537, in check_output 
    process = Popen(stdout=PIPE, *popenargs, **kwargs) 
    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 
OSError: [Errno 2] No such file or directory 

Toutefois, lorsque vous vous séparez la commande des options:

>>> subprocess.check_output(['ls', '-l']) 
# outputs my entire folder contents which are quite large. 

Je conseille vivement d'utiliser le subprocess.Popen -objet de traiter avec des processus externes. Utilisez Popen.communicate() pour obtenir les données à la fois stdout et stderr. De cette façon, vous ne devriez pas rencontrer de problèmes de blocage.

import os 
import subprocess 

executable = "/home/pi/pi_sensors-master/bin/Release/i2c.exe" 
proc = subprocess.Popen(['mono', executable]) 

try: 
    outs, errs = proc.communicate(timeout=15) # Times out after 15 seconds. 
except TimeoutExpired: 
    proc.kill() 
    outs, errs = proc.communicate() 

Ou vous pouvez appeler le communiquer dans une boucle si vous voulez un 'flux de données' de sorte, an answer from this question:

from subprocess import Popen, PIPE 

executable = "/home/pi/pi_sensors-master/bin/Release/i2c.exe" 
p = Popen(["mono", executable], stdout=PIPE, bufsize=1) 
for line in iter(p.stdout.readline, b''): 
    print line, 
p.communicate() # close p.stdout, wait for the subprocess to exit 
+0

je l'ai essayé, mais malheureusement rien n'est en cours de sortie – Hamoudy

+0

lorsque j'ai appuyé sur ctrl + c, je reçois cette erreur: http: // prntscr.com/3xy49i – Hamoudy

+0

Je n'ai aucune idée de ce que 'mono' est en train de faire, mais si c'est une sorte de service qui ne se termine pas, je suppose que' check_output() 'va bloquer. – msvalkon

Questions connexes