5

テスト目的で、安全でない可能性のあるいくつかのモジュールを動的にロードする必要があります。

セキュリティに関して、私のスクリプトはアクセス権の低いユーザーによって実行されます。

ただし、モジュール スクリプトが終了する保証がないため、インポート プロセスをエレガントにタイムアウトさせる方法が必要です。inputたとえば、への呼び出しや無限ループを含めることができます。

私は現在 を使用Thread.joinしてtimeoutいますが、スクリプトはバックグラウンドでまだ生きており、スレッドを強制終了する方法がないため、これで問題が完全に解決されるわけではありません。

from threading import Thread
import importlib.util

class ReturnThread(Thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._return = None

    def run(self):
        if self._target is not None:
            self._return = self._target(*self._args, **self._kwargs)

    def join(self, *args, **kwargs):
        super().join(*args, **kwargs)
        return self._return

def loader(name, path):
    spec = importlib.util.spec_from_file_location(name, path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module) # This may run into an infinite loop
    return module

module_loader = ReturnThread(loader, ('module_name', 'module/path'))
module_loader.start()
module = module_loader.join(timeout=0.1)

# The thread might still be alive here
if module is None:
    ...
else:
    ...

モジュールをインポートしてNone、スクリプトがタイムアウトした場合に戻すにはどうすればよいですか?

4

1 に答える 1