2010-07-07 12 views
7

Tôi đang phát triển trình thông dịch mã Python của riêng mình bằng cách sử dụng API Python C, như được mô tả trong tài liệu Python. Tôi đã xem xét mã nguồn Python và tôi đã cố gắng làm theo các bước tương tự được thực hiện trong trình thông dịch chuẩn khi thực hiện một tệp py. Những bước này (chuỗi C gọi hàm API) về cơ bản:Embedded Python - Hoạt động chặn trong mô-đun thời gian

PyRun_AnyFileExFlags() 
    PyRun_SimpleFileExFlags() 
    PyRun_FileExFlags() 
     PyArena_New() 
     PyParser_ASTFromFile() 
     run_mod() 
      PyAST_Compile() 
      PyEval_EvalCode() 
       PyEval_EvalCodeEx() 
        PyThreadState_GET() 
        PyFrame_New() 
        PyEval_EvalFrameEx() 

Sự khác biệt duy nhất ở mã của tôi là tôi làm bằng tay AST biên soạn, tạo khung hình, vv và sau đó tôi gọi PyEval_EvalFrame.

Với điều này, tôi có thể thực thi một tệp .py tùy ý với chương trình của tôi, như thể đó là trình thông dịch Python bình thường. Vấn đề của tôi xuất hiện khi mã mà chương trình của tôi đang thực thi sử dụng module thời gian: tất cả các hoạt động của mô đun thời gian bị chặn trong GIL! Ví dụ, nếu mã Python gọi time.sleep (1), cuộc gọi này bị chặn và không bao giờ được thực thi.

Rõ ràng là tôi đang làm điều gì đó sai để chặn GIL (và do đó chặn mô đun thời gian) nhưng tôi không biết cách sửa nó. Câu lệnh cuối cùng trong mã của tôi, nơi tôi có quyền kiểm soát là trong PyEval_EvalFrameEx, và từ thời điểm đó, mọi thứ chạy "như trong trình thông dịch Python thông thường", tôi nghĩ vậy.

Bất kỳ ai cũng gặp sự cố tương tự? Tôi đang làm gì sai, để tôi chặn module thời gian? Hy vọng ai đó có thể giúp tôi ...

Cảm ơn thời gian của bạn. Trân trọng,

R.

+0

Tôi tưởng tượng giấc ngủ của bạn là những gì chặn GIL. Có lý do thuyết phục nào để chạy một thông dịch viên homebrew không? – synthesizerpatel

Trả lời

1

Bạn cần cung cấp thêm chi tiết.

  • Hành vi của thông dịch viên của bạn khác với thông dịch viên chuẩn như thế nào?
  • Nếu bạn chỉ muốn chạy các tệp nguồn tùy ý, tại sao bạn không gọi một trong các giao diện cấp cao hơn, như PyRun_SimpleFile? Mã của bạn có gọi Py_Initialize không?