shutil.copy(), shutil.copy2(), shutil.copyfile():

これらのメソッドは、ファイルの内容をバイトで読み取り、
コピー先のファイルに書き込みます。
ファイルのサイズが大きい場合、このプロセスは時間がかかりますが、
Pythonは他のタスクをブロックせず、他の操作を進行させます。

os.systemを使用した場合
子シェルを作成し、そのシェルでコマンドを実行します。
ファイルのサイズが大きい場合、コピーに時間がかかりますが、
os.systemはコマンドの実行が完了するまでプログラムの実行をブロックします。
そのため、他の操作を進行させることはできません。

osモジュールを使用した場合
ファイルの内容をバイトで読み取り、コピー先のファイルに書き込むため、
ファイルのサイズが大きい場合、このプロセスは時間がかかります。
しかし、Pythonは他のタスクをブロックせず、他の操作を進行させます。

subprocessモジュールのrun関数を使用した場合
ファイルのサイズが大きい場合、コピーに時間がかかりますが、
subprocess.runはコマンドの実行が完了するまでプログラムの実行をブロックします。
そのため、他の操作を進行させることはできません。

subprocess.runは、デフォルトで子プロセスの標準出力と標準エラーを
親プロセスにリダイレクトします。
そのため、コピー中にエラーが発生した場合、
エラーメッセージは親プロセスに表示されます。