我與我用來標記句子的服務器進行交互。該服務器通過端口2020
在本地啓動。例如,如果我通過下面使用的客戶端端口2020
發送Je mange des pâtes .
,服務器回答Je_CL mange_V des_P pâtes_N ._.
,結果總是隻有一行,如果我的輸入不是空的,結果總是一行。在一個子進程stdin.write中破壞管道
我目前必須通過此服務器標記9 568個文件。前9,483個文件按預期標記。之後,輸入流看起來是關閉/滿/別的,因爲當我嘗試在stdin
上寫入時,我得到IOError
,特別是Broken Pipe
錯誤。
當我跳過前9483個第一個文件時,最後一個標記沒有任何問題,包括導致第一個錯誤的問題。
我的服務器不會產生任何錯誤日誌,指出發生了什麼魚腥味......我處理的東西不正確嗎?一段時間後管道失效是否正常?
log = codecs.open('stanford-tagger.log', 'w', 'utf-8')
p1 = Popen(["java",
"-cp", JAR,
"edu.stanford.nlp.tagger.maxent.MaxentTaggerServer",
"-client",
"-port", "2020"],
stdin=PIPE,
stdout=PIPE,
stderr=log)
fhi = codecs.open(SUMMARY, 'r', 'utf-8') # a descriptor of the files to tag
for i, line in enumerate(fhi, 1):
if i % 500:
print "Tagged " + str(i) + " documents..."
tokens = ... # a list of words, can be quite long
try:
p1.stdin.write(' '.join(tokens).encode('utf-8') + '\n')
except IOError:
print 'bouh, I failed ;(('
result = p1.stdout.readline()
# Here I do something with result...
fhi.close()
好,代碼看起來有點危險 - 你假設結果始終是一條線。也可以是在遠程主機上運行的服務器,對單個TCP連接中可發送的數據總量實施某些最大限制。也可能是Java客戶端中的問題。 – Aya
@Aya:我已經編輯過,以反映我在本地運行服務器的事實(對於我可以發送的數據總量還有限制嗎?我真的不知道這些事情)。另外,答案總是一條線,我想這個問題不是來自那裏。即使在調試模式下,Java也不會產生任何錯誤,這就是我困惑的原因:(感謝輸入! – m09
它非常依賴於客戶端和服務器代碼,以及客戶端如何將其標準輸入/標準輸出轉換爲TCP /從TCP如果你在本地運行服務器,你可以嘗試從等式中刪除客戶端,並讓Python直接連接到服務器。 – Aya