Zunächst mal zu den Symptomen, die Du siehst:
perlfunc system ist ein synchroner Aufruf in einem separaten Prozess, und so wie Du das benutzt, brauchst Du das auch: Denn erst, wenn dieser Prozess beendet ist, kannst Du
$ret abfragen. Mit dem
& schickt der Prozess, den Du mit
system erzeugst, den Python-Aufruf in den Hintergrund, dadurch geht dessen STDERR verloren.
Die möglichen Lösungen haben ja die hlubenow und bianca schon beschrieben:
IPC::Run und das sehr ähnliche Core-Modul
IPC::Open3 helfen beim Einfangen von STDERR, sind aber beide nicht wirklich asynchron. Wenn es nur darum geht, Ausgaben des Python-Programms abzufangen, dann ist
Capture::Tiny leichter zu bedienen.
"Asynchron" der schwierigere Teil des Problems. Dafür ist
perlfunc fork die Basisfunktion, braucht aber etwas Buchführung für die Verwaltung des Prozesses. CPAN-Module wie
Any::Event machen das "komfortabler". Das ändert aber nichts daran, dass Du überlegen musst, ob, wann und wie das Perl-Programm auf das Resultat des Python-Programms reagieren soll. Wenn es ausreicht, das Ergebnis "irgendwann" im Logfile zu haben, dann ist auch
Proc::Daemon eine Alternative.