subprocess.run uses Popen.communicate() which buffers data in memory. So some tasks that might be desirable to run (e.g. mysqldump | gzip ) will use too much memory and fail for many cases. Ideally this would instead just link up pipes across processes and handle the file descriptor management behind the scenes, so it could handle arbitrary command chains.