Printf işlevlerinin çıktısını Windows'taki bir dosyaya yeniden yönlendirmeye çalışıyorum. Fonksiyonları çağırmak için python3 ile ctypes kullanıyorum.Ctypes ile stdout yönlendirmesi
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")
Ama Eclipse kodunu çalıştırdığınızda Ekranda şu olsun: My kodudur
begin
end
Printf function 1
Printf function 2
Printf function 3
... ve TEST.TXT
python print
aşağıdaki
begin
end
: Ben cmd Bu çalıştırdığınızda
, bu ekranda budur
..ve bu test.txt içinde: Ben mesela ikinci dup2()
deyiminde açýklama
python print
Ekranda Eclipse itibaren
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")
:
begin
... ve Test.txt dosyada: cmd itibaren
python print
end
Printf function 1
Printf function 2
Printf function 3
, ekranda:
begin
... ve TEST.txt dosyasında:
python print
end
Şimdi tamamen karıştı. Tüm yönlendirme konularını StackOverflow üzerinde okudum ve neler olduğunu anlayamıyorum. Her neyse, topladığım şey, C işlevlerinin doğrudan dosya tanıtıcısına bağlanan stdout'a erişmesidir, python bunun için özel bir nesne kullanır - stdout File Object. Dolayısıyla, temel sys.stdout=*something*
, klişelerle çalışmaz. Dup2-ed çıkışında os.fdopen(1)
denedim ve her printf
ifadesinden sonra flush()
numaralı telefonu aradım ancak bu işlem tekrar çalışmıyor. Şimdi tamamen fikirden çıktım ve bunun için bir çözümü varsa memnun olurum.
neden bir şey yazdırmak için 'ctypes' kullanırım? – jfs
ile ilgili: [C paylaşılan kitaplığını python'da stdout'a yazdırmayı nasıl engellerim?] (Http://stackoverflow.com/q/5081657/4279) (dosyanızı "os.devnull" yerine kullanın) – jfs
Ben ' ve bu konuyu okuyun ve yardımcı olmuyor. Kodum örneklerinkiyle neredeyse aynı. Ctiplere ihtiyacım var çünkü daha sonra bunu printfs içeren bir C kütüphanesini test etmek için kullanacağım. –