テスト目的で、安全でない可能性のあるいくつかのモジュールを動的にロードする必要があります。
セキュリティに関して、私のスクリプトはアクセス権の低いユーザーによって実行されます。
ただし、モジュール スクリプトが終了する保証がないため、インポート プロセスをエレガントにタイムアウトさせる方法が必要です。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
、スクリプトがタイムアウトした場合に戻すにはどうすればよいですか?