stdin在python2.7中获取字符串,但只在python3.4中占用字节

时间:2016-04-29 09:04:47

标签: python-2.7 python-3.x

我正在尝试将模块从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)

2 个答案:

答案 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构造函数。