제 3 자 코드를 사용하면서 너무 많이 수정할 수는 없지만 여러 번 질문했지만 제 문제가 다릅니다. 코드에서 여러 번 호출되어 하위 프로세스를 만들고 stdin에 데이터를 쓰고 읽는 함수가 있습니다. 그것은 단지는 popen with python 읽기 및 쓰기 블록, python2.7
subprocess I/O operation on closed file
거기가 예외가 발생,이 라인
line = self.classifier.stderr.readline()
이 문제를 해결하지만, FUNC2 (분류, 벡터)부터하는 것은 여러 번 호출 할 필요가 않았다 popen.communicate을 사용하여에 달려 비 차단 읽기 작업을 수행하는 방법은 무엇입니까? 자세한
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))
# print self.classifier_cmd
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())
#self.cnt = 0
def classify(self, vectors):
# print '\n'.join(vectors) + "\n\n"
self.classifier.stdin.write('\n'.join(vectors) + "\n\n")
lines = []
line = self.classifier.stderr.readline()
while (line.strip() != ''):
# print line
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()
# print line
if line != '':
fields = line.split(':')
# print fields
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 func1 (extcmd):
cmd=extcmd
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')
return classifier
def func2(classifier, vectors):
classifier.stdin.write('\n'.join(vectors) + "\n\n")
lines = []
line = self.classifier.stderr.readline()
print("not reaching")
while (line.strip() != ''):
# print line
lines.append(line)
line = self.classifier.stderr.readline()
if __name__ == '__main__':
extcmd="some external shell script"
vectors="some results"
classifier=func1(extcmd)
func2(classifier, vectors)
이 문장 목록을 가진 외부 명령. 그런 다음 별도의 함수에서 모든 문장이 처리되어 각 문장마다 별도의 벡터가 제공됩니다. 이 새로운 벡터는 분류 함수에 전달됩니다.
def func2():
classifier=create a classifier object for an input file, this executes the external command
for sentence in sentences:
vectors=process(sentence)# some external function
classifier.classify(features)
부끄러워 플러그 : https://github.com/TeamHG-Memex/sklearn-crfsuite 유용한 찾을 수 있습니다; crfsuite 명령 줄을 래핑하는 것보다 쉬워야합니다. –