2015-01-08 40 views
1

我正在编写一个程序,该程序具有使用子进程接收/传输消息的功能,但是,我希望能够在后台运行接收程序,同时能够打印正在接收的内容。具有子处理功能的多处理

请参阅代码:

#!/usr/bin/python 

import subprocess,time, timeit 
from multiprocessing import Process, Queue 
import re, os, pprint, math 
from collections import defaultdict 

Dict = {} 
identifier = "" 
hexbits = [] 
count = defaultdict(int) 


def receive(): 
    process = subprocess.Popen('receivetest -f=/dev/pcan32', stdout=subprocess.PIPE) 
    lines = iter(process.stdout.readline, "") 
    try: 
     start = time.clock() 
     for line in lines: 
      if re.match(r"^\d+.*$",line): 
       splitline = line.split() 
       del splitline[1:4] 
       identifier = splitline[1] 
       count[identifier] += 1 
       end = time.clock() 
       timing = round((end - start) * 10000, 100) 
       dlc = splitline[2] 
       hexbits = splitline[3:] 
       Dict[identifier] = [dlc, hexbits, count[identifier],int(timing)] 
       time.sleep(0.005) 
       start = end 


    except keyboardinterrupt: 
     pass 

def transmit(command): 
    transfile = "transfile.txt" 
    file = open(transfile,'w') 
    file.write("# please type your can message below\n") 
    file.write("# using the following example\n") 
    file.write("# m s [can id] [data bytes]\n") 
    file.close() 
    os.system("vi transfile.txt") 
    trans = subprocess.Popen(command, stdout=subprocess.pipe) 
    lines = trans.communicate() 
    print lines 

operation = raw_input('please enter T for transmit and R for receive: ') 

if((operation == 'T') or (operation == 't')): 
    transmit(["transmitest", "transfile.txt","-f=/dev/pcan32"]) 
elif((operation == 'R') or (operation == 'r')): 
    if __name__ == '__main__': 
     os.system("echo \"i 0x011c e\" >/dev/pcan32") 
     #receive(["receivetest", "-f=/dev/pcan32"]) 
     run_receive = Process(target=receive, args=()) 
     run_receive.start() 
     run_receive.join() 
     for identifier, hexbits in Dict.items(): 
      os.system("clear") 
      pprint.pprint(Dict, width = 150) 

else: 
    print("PLEASE ENTER VALID OPTION") 

但是我收到以下错误:

Trace (most recent call last): 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
     self.run() 
    File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in run 
     self._target(*self._args, **self._kwargs) 
    File "./cancheck.py", line 16, in receive 
     process = subprocess.Popen(command, stdout=subprocess.PIPE) 
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
     errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 679, in _execute_child 
     raise child_exception 
OSError: [Errno 2] No such file or directory 

可能有人请帮助,我不知道如何多进程包含子流程的功能。

+0

我想你会通过直接调用'receive'而不涉及'multiprocessing'来得到同样的错误。 –

回答

2

它看起来像子流程命令调用无法解析文件。我建议验证transmitest是在执行路径中,并且transfile.txt/dev/pcan32都存在。

作为另一个说明,在receive定义中,您的Popen调用看起来像需要更改。

# Original version 
# process = subprocess.Popen('receivetest -f=/dev/pcan32', stdout=subprocess.PIPE) 

# Change to this: 
process = subprocess.Popen('receivetest -f=/dev/pcan32'.split(), stdout=subprocess.PIPE) 

原因是Popen期待迭代序列作为它的第一个参数。