Ваш код блокируется в строке:
for line in iter(subproc.stdout.readline, ''):
потому что единственный способ завершить эту итерацию - это когда достигается EOF (конец файла), что произойдет, когда подпроцесс завершится. Вы не хотите ждать, пока процесс завершится, однако вам нужно только дождаться, пока он закончит обработку строки, которая была ему отправлена.
Кроме того, вы столкнулись с проблемами с буферизацией, как уже указывал Крис Морган. В другом вопросе о стековом потоке обсуждается, как можно выполнять неблокирующие операции чтения с подпроцессом. Я взломал быструю и грязную адаптацию кода из этого вопроса к вашей проблеме:
def enqueue_output(out, queue):
for line in iter(out.readline, ''):
queue.put(line)
out.close()
kw = {}
kw['executable'] = '/usr/bin/perl'
kw['shell'] = False
kw['stderr'] = subprocess.PIPE
kw['stdin'] = subprocess.PIPE
kw['stdout'] = subprocess.PIPE
args = ['-w','/path/script.perl',]
subproc = subprocess.Popen(args, **kw)
f = codecs.open('/path/mydata','r','UTF-8')
q = Queue.Queue()
t = threading.Thread(target = enqueue_output, args = (subproc.stdout, q))
t.daemon = True
t.start()
for line in f:
subproc.stdin.write('%s\n'%(line.strip().encode('UTF-8')))
print "Sent:", line.strip() ### code hangs after printing this ###
try:
line = q.get_nowait()
except Queue.Empty:
pass
else:
print "Received:", line.rstrip().decode('UTF-8')
subproc.terminate()
f.close()
Вполне вероятно, что вам нужно будет внести изменения в этот код, но по крайней мере он не блокируется.