那么,如何使用stdin将二进制数据传递给要使用subprocess.run()
运行的可执行命令呢?
关于使用stdin将数据传递给外部可执行文件,文档非常模糊。我使用python3在linux机器上工作,我想调用dd of=/somefile.data bs=32
(如果我正确理解手册页,它会从stdin获取输入(,并且我在bytearray
中有二进制数据,我想通过stdin将其传递给命令,这样我就不必将其写入临时文件,并使用该文件作为输入来调用dd
。
我的要求只是将bytearray
中的数据传递给dd
命令,以便写入磁盘。使用subprocess.run()
和stdin实现这一点的正确方法是什么?
编辑:我的意思是:
ba = bytearray(b"some bytes here")
#Run the dd command and pass the data from ba variable to its stdin
您可以通过直接调用Popen
将一个命令的输出传递给另一个命令。
file_cmd1 = <your dd command>
file_cmd2 = <command you want to pass dd output to>
proc1 = Popen(sh_split(file_cmd1), stdout=subprocess.PIPE)
proc2 = Popen(file_cmd2, [shell=True], stdin=proc1.stdout, stdout=subprocess.PIPE)
proc1.stdout.close()
据我所知,这将在命令1的字节输出上正常工作。
在您的情况下,当您只想将数据传递给流程的stdin
时,您最想做的是:
out = bytearray(b"Some data here")
p = subprocess.Popen(sh_split("dd of=/../../somefile.data bs=32"), stdin=subprocess.PIPE)
out = p.communicate(input=b''.join(out))[0]
print(out.decode())#Prints the output from the dd
特别是对于OP要求的到subprocess.run()
的stdin,使用input
如下:
#!/usr/bin/python3
import subprocess
data = bytes("Hello, world!", "ascii")
p = subprocess.run(
"cat -", # The - means 'cat from stdin'
input=data,
# stdin=... <-- don't use this
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
print(p.stdout.decode("ascii"))
print(p.returncode)
# Hello, world!
# 0