我在pOpen.communicate()
中遇到了一个问题,发送到子进程的字符串在我发送到STDIN
时第一次出现空格字符时被截断(请记住,我使用编码utf-8
对字节进行编码)
输入文件text.txt
this is an input string
我的代码
from subprocess import Popen, PIPE
# open file and encode to utf-8 bytes
fp = open('test.txt')
inputs = fp.read()
inputBytes = bytes(inputs, 'utf-8')
# open subprogram and send the bytes to STDIN
p = Popen(['./program'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
stdout_data = p.communicate(input=inputBytes)
# print STDOUT of subprocess, will print what was given
out = str(stdout_data).split('\\n')
for frame in out:
print(frame)
我的预期输出:
(b'this is an input string', b'')
我得到是:
(b'this', b'')
我是否使用了错误的编码格式?子程序是一个go应用程序,它使用scanf来侦听pOpen.communicate()数据
package main
import "fmt"
func main() {
var inputs string
fmt.Print("")
fmt.Scanf("%s", &inputs)
fmt.Println(inputs)
}
1条答案
按热度按时间qybjjes11#
Go语言的
fmt.Scanf
是基于C语言的scanf
;%s
跳过前导空格,然后读取下一个单词直到第一个空格。这可能不是您想要的。从文件上看,更精确一点:
predicate 处理的输入是隐式空格分隔的:除了
%c
之外,每个动词的实现都是从放弃剩余输入的前导空格开始的,而%s
动词(以及读入字符串的%v
)在第一个空格或换行符处停止使用输入。(https://pkg.go.dev/fmt)