首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Bash管道输出到与Python兼容的格式

将Bash管道输出到与Python兼容的格式
EN

Stack Overflow用户
提问于 2022-05-25 19:57:59
回答 1查看 68关注 0票数 0

我正在使用UDPipe模型进行文本标记化和柠檬化。我可以通过使用!echo命令或将其打印到文件中来完成任务本身,但是我希望生成一个Python结构来进一步处理输出。

什么起作用

这是我的工作命令:

代码语言:javascript
复制
!echo 'the text I'm processing' | ./udpipe --tokenize --tag './path/to/my/model'

退出:

代码语言:javascript
复制
Loading UDPipe model: done.
newdoc
newpar
sent_id = 1
text = прывітанне, сусвет
1   прывітанне  прывітанне  NOUN    NN  Animacy=Inan|Case=Nom|Gender=Neut|Number=Sing   _   _   _   SpaceAfter=No
2   ,   ,   PUNCT   PUNCT   _   _   _   _   _
3   сусвет  сусвет  NOUN    NN  Animacy=Inan|Case=Nom|Gender=Masc|Number=Sing   _   _   _   SpacesAfter=\n

这用于将输出打印到文件中:

代码语言:javascript
复制
!echo 'the text I'm processing' | ./udpipe --tokenize --tag './path/to/my/model' >> filename.txt

./udpipe是包的克隆存储库。

我尝试过的(但没有成功)

os.system()

代码语言:javascript
复制
import os
text = 'the text I'm processing'
cmd = "echo '{}' | ./udpipe --tokenize --tag './path/to/my/model'".format(text)
os.system(cmd)

Out: 0

subprocess.getoutput()

代码语言:javascript
复制
import subprocess
cmd = "'the text I'm processing' | ./udpipe --tokenize --tag './path/to/my/model'"
output = subprocess.getoutput(cmd, stdout=subprocess.PIPE, shell=True)
print(output)

TypeError: getoutput() got an unexpected keyword argument 'stdout'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 16:05:09

您已经做了一些研究,并发现了subprocess模块,这是从Python调用进程的最常见方式。如果您想使用shell的功能(例如管道),则需要将参数shell=True传递给任何实际调用进程的函数,例如subprocess.Popen(),基本进程。

代码语言:javascript
复制
from subprocess import Popen, PIPE

text = "the text I'm processing"
cmd = "echo", text, "|", "./udpipe", "--tokenize", "--tag", "./path/to/my/model"
proc = Popen(cmd, stdout=PIPE, stderr=PIPE, text=True, shell=True)
output, _ = proc.communicate()
print(output)

在您的示例中,您还使用了>>将输出追加到文件中,因此不会产生输出,您只需等待进程结束:

代码语言:javascript
复制
from subprocess import Popen

text = "the text I'm processing"
cmd = "echo", text, "|", "./udpipe", "--tokenize", "--tag", "./path/to/my/model", ">>", "filename.txt"
proc = Popen(cmd, shell=True)
proc.wait()

或者您可以应用高级函数subprocess.call()

代码语言:javascript
复制
from subprocess import call

text = "the text I'm processing"
cmd = "echo", text, "|", "./udpipe", "--tokenize", "--tag", "./path/to/my/model", ">>", "filename.txt"
call(cmd, shell=True)

如果要在代码中获得进程输出,可以使用另一个更高级别的函数subprocess.check_output()

代码语言:javascript
复制
from subprocess import check_output

text = "the text I'm processing"
cmd = "echo", text, "|", "./udpipe", "--tokenize", "--tag", "./path/to/my/model"
output = check_output(cmd, text=True, shell=True)
print(output)

但是!您也可以使用python功能。例如,使用Popen(),您可以将输入传递给进程,并(如果需要)直接将其重定向到文件:

代码语言:javascript
复制
from subprocess import Popen, PIPE

text = "the text I'm processing"
cmd = "./udpipe", "--tokenize", "--tag", "./path/to/my/model"
proc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, text=True)
output, _ = proc.communicate(input=text)
print(output)
# OR write to file directly
with open("filename.txt", "a+") as out:
    proc = Popen(cmd, stdin=PIPE, stdout=out, stderr=out, text=True)
    proc.communicate(input=text)

高级check_output()也是如此

代码语言:javascript
复制
from subprocess import check_output, STDOUT

text = "the text I'm processing"
cmd = "./udpipe", "--tokenize", "--tag", "./path/to/my/model"
output = check_output(cmd, input=text, stderr=STDOUT, text=True)
print(output)

最后一个选项是我会使用的,但你可以应用你最喜欢的一个。

你可以帮助我的国家,检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72383503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档