Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python启动asm编译的二进制文件并捕获输出_Python_Assembly_Subprocess - Fatal编程技术网

使用python启动asm编译的二进制文件并捕获输出

使用python启动asm编译的二进制文件并捕获输出,python,assembly,subprocess,Python,Assembly,Subprocess,我编写了一个简单的asm二进制文件,用于获取用户的参数,然后使用C func printf在屏幕上打印它 因此,代码是通过以下方式编译的: nasm -f elf64 ... gcc -m64 -no-pie .... 这个程序运行得很好。我想将它与python一起使用,这样我就可以使用subprocess.Popen(cmd)启动它(这也很有效) BUUUT当我想要捕获asm编译程序的输出以便用python解析它时,输出总是空的 我试过: subprocess.Popen(cmd, stdo

我编写了一个简单的asm二进制文件,用于获取用户的参数,然后使用C func printf在屏幕上打印它

因此,代码是通过以下方式编译的:

nasm -f elf64 ...
gcc -m64 -no-pie ....
这个程序运行得很好。我想将它与python一起使用,这样我就可以使用subprocess.Popen(cmd)启动它(这也很有效)

BUUUT当我想要捕获asm编译程序的输出以便用python解析它时,输出总是空的

我试过:

subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE)
subprocess.call(...)
subprocess.run(...)
subprocess.check_output(...)
os.system(...)
os.popen(...)
不管怎样,我想我测试了所有的方法。。。我真的不明白为什么这个程序在我的python脚本上运行得很好,除非我尝试捕获输出

如果有人有想法,请告诉我

asm代码为:

; nasm -f elf64 -o test.o test.asm
; gcc -m elf64 test.o -o test

extern printf

section .text
global main
main:
    mov rdi, fmt
    mov rsi, s_val
    xor rax, rax
    call printf WRT ..plt

    ; exit
    xor rdi, rdi,
    mov rax, 0x3c
    syscall


section .data
    s_val db 'hello world', 0
    fmt db '%s',0x0a, 0
python代码是:

#!/usr/bin/python3

import subprocess
from subprocess import Popen

p = Popen(['/home/test'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

r = p.communicate()

print(r)

thx

这是一个经典:您使用libc中的stdio函数,然后使用原始退出系统调用终止您的程序,永远不会给它在退出时刷新输出的机会

通过使用
exit
函数而不是原始退出系统调用退出程序来解决此问题:

call exit wrt ..plt

或者,只需从
main
返回,让C运行时启动代码为您退出程序。

您应该显示代码。确保它实际上正在写入
stdout
stderr
。许多人会错误地向stdin写入内容,而stdin恰好适用于终端。请使用添加新信息到您的问题中。太好了!它起作用了@银杏确保将答案标记为已接受,以表明您的问题已解决,无需进一步帮助。