Sto provando a reindirizzare l'output delle funzioni di printf su un file su Windows. Sto usando i ctypes con python3 per invocare le funzioni. Il mio codice è:reindirizzamento stdout con i tipi di carattere
import os, sys
from ctypes import *
if __name__ == '__main__':
print("begin")
saved_stdout=os.dup(1)
test_file=open("TEST.TXT", "w")
os.dup2(test_file.fileno(), 1)
test_file.close()
print("python print")
cdll.msvcrt.printf(b"Printf function 1\n")
cdll.msvcrt.printf(b"Printf function 2\n")
cdll.msvcrt.printf(b"Printf function 3\n")
os.dup2(saved_stdout, 1)
print("end")
Ma quando ho eseguito il codice da Eclipse ottengo il seguente sullo schermo:
begin
end
Printf function 1
Printf function 2
Printf function 3
... e quanto segue nella TEST.TXT
python print
Quando eseguo questo da cmd, questo è ciò che è sullo schermo:
begin
end
..e questo è nel TEST.TXT:
python print
Quando io commento la seconda dup2()
dichiarazione per esempio
import os, sys
from ctypes import *
if __name__ == '__main__':
print("begin")
saved_stdout=os.dup(1)
test_file=open("TEST.TXT", "w")
os.dup2(test_file.fileno(), 1)
test_file.close()
print("python print")
cdll.msvcrt.printf(b"Printf function 1\n")
cdll.msvcrt.printf(b"Printf function 2\n")
cdll.msvcrt.printf(b"Printf function 3\n")
#os.dup2(saved_stdout, 1)
print("end")
Da Eclipse, sullo schermo:
begin
... e nel file Test.txt:
python print
end
Printf function 1
Printf function 2
Printf function 3
Da cmd, sullo schermo:
begin
... e nel file TEST.txt:
python print
end
Sono completamente confuso ora. Ho letto tutti i thread di reindirizzamento qui su StackOverflow e non riesco a capire cosa sta succedendo. Comunque, quello che ho raccolto è che le funzioni C accedono allo stdout che è collegato direttamente al descrittore del file, mentre python usa un oggetto speciale per quell'oggetto file stdout. Quindi la elementare sys.stdout=*something*
non funziona con i tipi. Ho anche provato os.fdopen(1)
sull'output di dup2-ed e quindi chiamando flush()
dopo ogni istruzione printf
ma questo non funziona di nuovo. Ora sono completamente fuori di idee e apprezzerei se qualcuno avesse una soluzione per questo.
Perché usi 'ctypes' di stampare qualcosa? – jfs
correlate: [Come è possibile impedire una libreria C condivisa per stampare su stdout in Python?] (Http://stackoverflow.com/q/5081657/4279) (utilizzare il file invece di 'os.devnull') – jfs
I' Ho letto questa discussione e non è utile. Il mio codice è quasi uguale a quello degli esempi. Ho bisogno di ctypes perché lo userò più tardi per testare un'unità in una libreria C che contiene printfs. –