I ran into a similar problem that another @AMisra user posted some time ago but did not receive a definitive answer. The problem is that I use third-party code and cannot change it too much. I have a function that is called many times in code to create a subprocess, write data to stdin and then read it. He just hangs on this line
line = self.classifier.stderr.readline()
Note that I cannot use communicate: since I func2(classifier, vectors)need to call it several times, it throws an exception.
import subprocess
import paths
import os.path
class CRFClassifier:
def __init__(self, name, model_type, model_path, model_file, verbose):
self.verbose = verbose
self.name = name
self.type = model_type
self.model_fname = model_file
self.model_path = model_path
if not os.path.exists(os.path.join(self.model_path, self.model_fname)):
print 'The model path %s for CRF classifier %s does not exist.' % (os.path.join(self.model_path, self.model_fname), name)
raise OSError('Could not create classifier subprocess')
self.classifier_cmd = '%s/crfsuite-stdin tag -pi -m %s -' % (paths.CRFSUITE_PATH,
os.path.join(self.model_path, self.model_fname))
self.classifier = subprocess.Popen(self.classifier_cmd, shell = True, stdin = subprocess.PIPE, stderr = subprocess.PIPE)
if self.classifier.poll():
raise OSError('Could not create classifier subprocess, with error info:\n%s' % self.classifier.stderr.readline())
def classify(self, vectors):
self.classifier.stdin.write('\n'.join(vectors) + "\n\n")
lines = []
line = self.classifier.stderr.readline()
while (line.strip() != ''):
lines.append(line)
line = self.classifier.stderr.readline()
if self.classifier.poll():
raise OSError('crf_classifier subprocess died')
predictions = []
for line in lines[1 : ]:
line = line.strip()
if line != '':
fields = line.split(':')
label = fields[0]
prob = float(fields[1])
predictions.append((label, prob))
seq_prob = float(lines[0].split('\t')[1])
return seq_prob, predictions
def poll(self):
"""
Checks that the classifier processes are still alive
"""
if self.classifier is None:
return True
else:
return self.classifier.poll() != None
- , , . , . .
def func2():
classifier=create a classifier object for an input file, this executes the external command
for sentence in sentences:
vectors=process(sentence)
classifier.classify(features)