Trong ngữ cảnh của một ứng dụng phức tạp, tôi cần phải nhập khẩu các tập lệnh 'do người dùng cung cấp'. Lý tưởng nhất, một kịch bản sẽ phảiNhập khẩu một mô-đun python mà không thực sự thực thi nó
def init():
blah
def execute():
more blah
def cleanup():
yadda
vì vậy tôi muốn chỉ
import imp
fname, path, desc = imp.find_module(userscript)
foo = imp.load_module(userscript, fname, path, desc)
foo.init()
Tuy nhiên, như chúng ta đều biết, kịch bản của người dùng là thực hiện càng sớm càng load_module
chạy. Điều đó có nghĩa, một kịch bản có thể được một cái gì đó như thế này:
def init():
blah
yadda
nhượng cho những phần yadda
được gọi ngay sau khi tôi import
kịch bản.
Những gì tôi cần là một cách để:
- kiểm tra đầu tiên cho dù nó đã init(), thực hiện() và dọn dẹp()
- nếu chúng tồn tại, tất cả là tốt
- nếu họ don 't tồn tại, phàn nàn
- không chạy bất kỳ mã khác, hoặc ít nhất là không cho đến khi tôi biết không có init()
Thông thường tôi sẽ buộc việc sử dụng các cũ if __name__ == '__main__'
lừa, nhưng tôi có ít quyền kiểm soát trên tập lệnh do người dùng cung cấp, vì vậy tôi đang tìm một giải pháp tương đối không đau. Tôi đã thấy tất cả các loại thủ thuật phức tạp, bao gồm phân tích cú pháp kịch bản, nhưng không có gì thực sự đơn giản. Tôi ngạc nhiên vì nó không tồn tại .. hoặc có lẽ tôi không nhận được một cái gì đó.
Cảm ơn.
Tôi chỉ muốn nói với người dùng của bạn sử dụng 'if __name__' vv Nếu họ không làm điều đó, đó chỉ là lookout của họ. –
@DavidHeffernan vâng, đó sẽ là cách thông thường. Nhưng tôi ngạc nhiên không có cách nào * thực tế * để làm điều này mà không cần phải nói chuyện với một con người – lorenzog
Do tính chất của Python, bạn không thể nói những gì trong đó cho đến khi nó được thực hiện. Bạn có thể lấy nó bằng cách sử dụng 'find_module' và sau đó kiểm tra nó theo cách thủ công ... mà vẫn sẽ thiếu sót vì nó có thể lấy mã từ những nơi khác hoặc sử dụng mã lạ như rot13 hoặc những thứ thú vị khác. –