python子进程stdin在第一个空格处被截断

pnwntuvh  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(102)

我在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)
}
qybjjes1

qybjjes11#

Go语言的fmt.Scanf是基于C语言的scanf; %s跳过前导空格,然后读取下一个单词直到第一个空格。这可能不是您想要的。
从文件上看,更精确一点:
predicate 处理的输入是隐式空格分隔的:除了%c之外,每个动词的实现都是从放弃剩余输入的前导空格开始的,而%s动词(以及读入字符串的%v)在第一个空格或换行符处停止使用输入。(https://pkg.go.dev/fmt

相关问题