Python版本= 2.7時,Windowsstderr重定向到一個任意文件
嗨,
我的Python腳本使用共享的C庫,我想重定向腳本的標準iOS和在一個文件中,如以下示例中的共享C庫(僅限於stderr流)
ç共享庫代碼:
#include <stdio.h>
void my_print(void)
{
fprintf(stderr, "This string isn't displayed\n");
}
的Python腳本:
import os, sys, ctypes
def test():
parserDll = ctypes.CDLL("./titi.dll") # my shared C library
file_stderr_fds = os.open("./toto.txt", 777) # file in which redirect the stderr
saved_stderr_fds = os.dup(2) # Backup stderr
os.dup2(file_stderr_fds, 2) # Redirect stderr to file
print >> sys.stderr, "zozo" # Python test redirect for Python script --> Ok
parserDll.my_print(None) # test for the shared C library --> KO
if __name__ == "__main__":
test()
當我運行這個Python腳本,在toto.txt文件我看了從共享C庫「ZOZO」(從Python腳本顯示),但一無所獲。但是,如果我評論os.dup2(),兩個字符串都顯示在控制檯中。 爲什麼? 對於使用的Python腳本和共享C庫,標準IO是不是相同?在這種情況下,我該如何重定向到同一個文件?
我認爲兩個stderr流是不同的。所以你應該重定向他們兩個到同一個文件。 – prehistoricpenguin
對於故障隔離,我想我會嘗試從shell中重定向。註釋掉所有重複文件描述符和所有東西的Python代碼。然後,在bash shell中運行'python your-script.py 2&> errors.txt'。這會將stderr重定向到shell級別的文件'errors.txt'。這是否會捕獲您所期望的所有錯誤文本? –
謝謝你的回答。現在很奇怪,但是當使用Visual Studio編譯庫時,shell命令將工作並重定向到一個文件;但是當GCC完成這項工作時,DLL中的字符串不會寫入!無論如何,我真的需要它直接從腳本中直接運行,而不需要任何shell命令,因爲它旨在用於GUI ... –