Tôi đã thử nghiệm với việc nhúng các ngôn ngữ kịch bản khác nhau trong một ứng dụng C++, hiện tại tôi đang thử Stackless Python 3.1. Tôi đã thử một số hướng dẫn và ví dụ, những gì tôi có thể tìm thấy, để thử và chạy một kịch bản đơn giản từ một ứng dụng.Tại sao lỗi Python/C gặp lỗi trên PyRun_SimpleFile?
Py_Initialize();
FILE* PythonScriptFile = fopen("Python Scripts/Test.py", "r");
if(PythonScriptFile)
{
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
fclose(PythonScriptFile);
}
Py_Finalize();
Đối với một số lý do kỳ quặc, chạy mảnh này kết quả mã trong một vi phạm truy cập tại địa chỉ:
PyRun_SimpleFile(PythonScriptFile, "Python Scripts/Test.py");
Tôi đã tìm kiếm trực tuyến cho những người khác với một vấn đề tương tự và chỉ có một được tìm thấy. Giải pháp duy nhất của họ là giải pháp mà dường như chỉ có thể có trong phiên bản cũ của Python: Tạo đối tượng tệp python và trả về FILE*
từ đối tượng tệp python đó thành PyRun_SimpleFile
. Tuy nhiên, các hàm gọi hàm này không có sẵn, API Python 3.1 tạo các đối tượng tệp từ một bộ mô tả tệp và trả về các bộ mô tả tệp, nhưng hàm PyRun_SimpleFile
vẫn yêu cầu một FILE*
.
Tôi không biết làm cách nào để chạy bất kỳ tập lệnh nào từ tệp, thiếu tải toàn bộ tệp vào bộ nhớ theo cách thủ công và chạy nó dưới dạng chuỗi khổng lồ, chắc chắn không phải là giải pháp thiết thực.
Điều gì mang lại? Làm cách nào tôi có thể thực hiện tác vụ này nếu API có lỗi nội bộ?
Cập nhật: Tôi đã quản lý để xây dựng Stackless Python 3.1 từ nguồn và sự cố vẫn hoàn toàn không thay đổi, mặc dù sử dụng cùng một thư viện thời gian chạy C. Cả dự án của tôi và nguồn Stackless Python 3.1 đều được xây dựng với trình biên dịch C++ của Visual Studio 2010 và thời gian chạy C. Tôi không còn có bất kỳ ý tưởng nào về những gì có thể giải quyết được vấn đề này, thiếu sửa đổi Python để sử dụng tên tệp và không phải là một TẬP_TIN *. Một cách giải quyết khủng khiếp khác.
Aye, tôi không xây dựng thư viện Stackless Python 3.1 của tôi. Tôi đã đọc rằng vấn đề rất có thể là việc sử dụng các FILE * từ các thời gian chạy khác nhau, do đó giải pháp thay thế là cho phép thư viện Python tạo FILE * và trả về nó để sử dụng làm đối số cho hàm. Vì vậy, sau đó, tôi không có tùy chọn, nhưng để có được nguồn và xây dựng Stackless Python 3.1 bản thân mình? –
Nếu bạn có thể xây dựng mã C, thì bạn sẽ không gặp bất kỳ khó khăn nào với mã Stackless. –