KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I work with a python lib that imports a C shared library that prints on stdout. I want a clean output in order to use it with pipes or to redirect in files. The prints are done outside of python, in the shared library. At the beginning, my approach was: # file: test.py import os from ctypes import * from tempfile import mktemp libc = CDLL("libc.so.6") print # That's here on purpose, otherwise hello word is always printed tempfile = open(mktemp(),'w') savestdout = os.dup(1) os.close(1) if os.dup(tempfile.fileno()) != 1: assert False, "couldn't redirect stdout - dup() error" # let's pretend this is a call to my library libc.printf("hello world\n") os.close(1) os.dup(savestdout) os.close(savestdout) This first approach is half working: - For some reason, it needs a "print" statement just before moving stdout, otherwise hello word is always printed. As a result it will print an empty line instead of all the fuzz the library usually outputs. - More annoying, it fails when redirecting to a file: $python test.py > foo && cat foo hello world My second python attempt was inspired from another similar thread given in the comments: import os import sys from ctypes import * libc = CDLL("libc.so.6") devnull = open('/dev/null', 'w') oldstdout = os.dup(sys.stdout.fileno()) os.dup2(devnull.fileno(), 1) # We still pretend this is a call to my library libc.printf("hello\n") os.dup2(oldstdout, 1) This one also fails to prevent "hello" from printing. Since I felt this was a bit low level, I then decided to go completely with ctypes. I took inspiration from this C program, which does not print anything: #include <stdio.h> int main(int argc, const char *argv[]) { char buf[20]; int saved_stdout = dup(1); freopen("/dev/null", "w", stdout); printf("hello\n"); // not printed sprintf(buf, "/dev/f
Tags (comma-separated)
Save Edits
Cancel