Tôi đang gặp một số vấn đề khi nhận được Python IO chuyển hướng đến bàn điều khiển mà tôi đã cấp cho ứng dụng Win32 của mình. Có một luồng cụ thể Python mà tôi cần phải chuyển hướng không?Chuyển hướng Embedded Python IO sang bàn điều khiển được tạo với AllocConsole
Dưới đây là hơn hoặc ít hơn những gì tôi đang làm gì bây giờ (kiểm tra lỗi loại bỏ, vv):
int __stdcall WinMain(/*Usual stuff here*/) {
// Create the console
AllocConsole();
SetConsoleTitle(L"My Console");
// Redirect Standard IO Streams to the new console
freopen("CONOUT$","w",stdout);
freopen("CONOUT$","w",stderr);
freopen("CONIN$","r",stdin);
// Test the console:
printf("This Works.\r\n");
cout << "So Does this" << endl;
// Python Stuff (This is where it fails)
Py_Initialize();
PyRun_SimpleString("print('I don't work.')\n");
Py_Finalize();
}
Nếu tôi chạy điều tương tự nhưng là một ứng dụng giao diện điều khiển (Visual Studio 05, BTW) và loại bỏ AllocConsole gọi mọi thứ đều hoạt động. Có ai biết tôi đang thiếu gì không?
EDIT: Chỉ cần làm rõ, tôi đang tìm cách để làm điều đó từ API C.
YET MỘT SỐ CHỈNH SỬA KHÁC: Giải pháp của Alex là chính xác, nhưng đối với bất kỳ ai sử dụng Python 3.x bạn có thể nhận thấy rằng hàm PyFile_FromString bị thiếu trong API mới. Trong khi nó có thể không phải là lựa chọn tốt nhất, tôi thấy rằng đây hoạt động tốt bằng Python 3.x:
PyObject* sys = PyImport_ImportModule("sys");
PyObject* io = PyImport_ImportModule("io");
PyObject* pystdout = PyObject_CallMethod(io, "open", "ss", "CONOUT$", "wt");
if (-1 == PyObject_SetAttrString(sys, "stdout", pystdout)) {
/* Announce your error to the world */
}
Py_DECREF(sys);
Py_DECREF(io);
Py_DECREF(pystdout);
Cảm ơn, tôi đánh giá cao những gợi ý, nhưng tôi đoán tôi cần phải có được rõ ràng hơn: Tôi đang tìm kiếm một cách để làm điều này thông qua api C. Các tài liệu cho các tập tin/sys API là, tốt, spotty lúc tốt nhất. Như vậy tôi đã không có nhiều may mắn tìm ra nó một mình. – Toji
OK, hãy để tôi chỉnh sửa câu trả lời sau đó. –
Có - cho thấy cách dịch một dòng Python thành 7 dòng với API C (có thể nhiều hơn, tùy thuộc vào các chẩn đoán lỗi). (Xem tại sao các lập trình viên Python và C-API có kinh nghiệm thường gợi ý chỉ chạy chuỗi mã Python từ C thay vì? -). –