Tôi đang tạo một ứng dụng wxpython mà tôi sẽ biên dịch với các tiện ích đóng băng khác nhau để tạo một tệp thực thi cho nhiều nền tảng.Python - Tạo một hệ thống "tập lệnh"
chương trình sẽ là một editer bản đồ cho một gạch dựa trên công cụ trò chơi
trong ứng dụng này tôi muốn cung cấp một hệ thống kịch bản để người dùng nâng cao có thể điều chỉnh hành vi của các chương trình như thay đổi dữ liệu dự án, xuất khẩu dự án sang một định dạng khác ect.
Tôi muốn hệ thống hoạt động như vậy.
người dùng sẽ đặt tập lệnh python mà họ muốn chạy vào hộp văn bản được tạo kiểu và sau đó nhấn nút để thực thi tập lệnh.
Tôi rất hài lòng với điều này cho đến nay thats tất cả những thứ thực sự đơn giản. lấy kịch bản từ các văn bản hộp như là một chuỗi biên dịch nó vào một đối tượng cá tuyết với chức năng biên dịch sẵn có() sau đó thực thi kịch bản với một Statment exec
script = textbox.text #bla bla store the string
code = compile(script, "script", "exec") #make the code object
eval(code, globals())
điều là, tôi muốn chắc chắn rằng tính năng này không thể gây ra bất kỳ lỗi hoặc lỗi nào
nói nếu có câu lệnh nhập trong tập lệnh. điều này sẽ gây ra bất kỳ vấn đề nào có tính đến mã đã được biên dịch với một cái gì đó như py2exe hoặc py2app?
làm cách nào để đảm bảo rằng người dùng không thể phá vỡ phần quan trọng của chương trình như sửa đổi một phần GUI trong khi vẫn cho phép họ sửa đổi dữ liệu dự án (dữ liệu được giữ trong thuộc tính chung trong mô-đun riêng của nó)? Tôi nghĩ rằng điều này có nghĩa là sửa đổi các dict globals được chuyển đến hàm eval.
làm cách nào để đảm bảo rằng eval này không thể khiến chương trình bị treo do vòng lặp dài hoặc vô hạn? làm cách nào để đảm bảo rằng lỗi được nêu trong mã của người dùng không thể làm hỏng toàn bộ ứng dụng?
về cơ bản, làm cách nào để tránh tất cả các sự cố có thể phát sinh khi cho phép người dùng chạy mã của riêng họ?
EDIT: Liên quan đến câu trả lời cho
Tôi không cảm thấy giống như bất kỳ các câu trả lời cho đến nay đã thực sự trả lời câu hỏi của tôi vâng họ có được trong phần trả lời nhưng không hoàn toàn. Tôi biết rõ rằng không thể dừng hoàn toàn mã không an toàn. mọi người chỉ là quá thông minh đối với một người (hoặc thậm chí là một teem) để nghĩ về tất cả các cách để có được xung quanh một hệ thống an ninh và ngăn chặn chúng.
thực ra tôi không thực sự quan tâm nếu họ làm. Tôi lo lắng hơn về một số người vô ý phá vỡ một cái gì đó mà họ không biết. nếu một số người thực sự muốn họ có thể xé ứng dụng thành từng mảnh với chức năng kịch bản, nhưng tôi không thể quan tâm ít hơn. nó sẽ là ví dụ của họ và tất cả các vấn đề mà họ tạo ra sẽ biến mất khi họ khởi động lại ứng dụng trừ khi họ đã nhầm lẫn với các tệp trên HD. Tôi muốn ngăn chặn các vấn đề phát sinh khi người dùng liều một cái gì đó ngu ngốc.
những thứ như IOError's, SystaxErrors, InfiniteLoopErrors ect.
bây giờ phần về phạm vi đã được trả lời. Bây giờ tôi hiểu cách xác định chức năng và globals nào có thể được truy cập từ hàm nhưng có cách nào để đảm bảo rằng việc thực thi mã của chúng có thể bị dừng lại nếu quá trình này mất quá nhiều thời gian?
một hệ thống luồng màu xanh lá cây có lẽ?(Màu xanh lá cây vì nó sẽ là eval để làm cho người dùng lo lắng về an toàn thread)
cũng nếu một người dùng sử dụng một tuyên bố import module
để nạp một module từ ngay cả những thư viện mặc định mà không được sử dụng trong phần còn lại của lớp. điều này có thể gây ra sự cố với ứng dụng đang bị đóng băng bởi Py2exe, Py2app hoặc Freeze không? nếu họ gọi phương thức bên ngoài của thư viện chuẩn thì sao? nó sẽ là đủ mà các phương thức có mặt trong cùng một thư mục như thực thi đông lạnh?
Tôi muốn nhận được những câu trả lời này với việc tạo ra một câu hỏi mới nhưng tôi sẽ làm gì nếu tôi phải.
Đánh giá thực tế là không thể thực hiện được imo hoàn toàn an toàn (nhưng đó không phải là lĩnh vực chuyên môn chính của tôi, tôi có thể đang nói chuyện với tôi). Tại sao không đi theo cách phát triển một API với cấu trúc trình cắm thêm cho điều này, nếu phạm vi bảo mật/tích hợp và chức năng là một mối quan tâm? –
Hey, ít nhất nó không phải là 'exec'. – nmichaels
Ít nhất, hãy nhận ra rằng đây là một trong những trường hợp thực sự hiếm hoi mà một gotta-catch-'em-all 'ngoại trừ: 'có ý nghĩa và áp dụng nó. Không cần phải sụp đổ toàn bộ ứng dụng vì người dùng tương đối mới với python đã bỏ lỡ một không gian. 1 và được yêu thích, tôi mong muốn kết hợp một REPL Python vào một ứng dụng của tôi nữa. – delnan