我正在尝试将模块从python2.7移植到python3.4。在python2.7(下面的代码)中,分类器接受一个字符串对象(i)并在从stdout读取的毫秒内返回输出。
然而,当我将代码更改为python3.4时,stdin抱怨它只需要输入字节。使用
将输入(i)转换为字节i = i.encode('utf-8)
有效,但无法从stdout读取输出。为什么呢?
不幸的是我不熟悉tweets.annotated.csv.model
中的代码class CapClassifier:
def __init__(self, model='%s/data/cap2/tweets.annotated.csv.model' % (BASE_DIR)):
self.capClassifier = subprocess.Popen('%s/python/cap/cap_classify %s/data/cap2/tweets.annotated.csv.model' % (BASE_DIR, BASE_DIR),
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
self.fe = FeatureExtractor('%s/data/cap2/tweets_cap.vocab' % (BASE_DIR))
def Classify(self, words):
i = "%s\n" % self.fe.Extract(' '.join(words))
self.capClassifier.stdin.write(i)
(features, prediction) = self.capClassifier.stdout.readline().rstrip('\n').split('\t')
return float(prediction)
答案 0 :(得分:1)
原来我必须添加universal_newlines=True
来接受Robin的答案中所述的字符串,并在self.capClassifier.stdin.flush()
- 语句之后添加write
以便返回结果
答案 1 :(得分:0)
Popen.stdin
如果stdin参数是PIPE,则此属性是open()返回的可写流对象。如果universal_newlines参数为True,则流是文本流,否则它是字节流。如果stdin参数不是PIPE,则此属性为None。
可以从python文档中引用这个引用。将Option[T]
添加到subprocess.Popen构造函数。