#python #perl
#python #perl
Вопрос:
Мне нужно вызвать «/usr/bin/pdf2txt.py «с несколькими аргументами из моего скрипта Perl. Как я должен это сделать?
Ответ №1:
Если вам нужно захватить стандартный вывод:
my $ret = `/usr/bin/pdf2txt.py arg1 arg2`;
Вы можете легко захватить STDERR, перенаправив его в стандартный вывод:
my $ret = `/usr/bin/pdf2txt.py arg1 arg2 2>amp;1`;
Если вам нужно зафиксировать статус выхода, то вы можете использовать:
my $ret = system("/usr/bin/pdf2txt.py arg1 arg2");
Имейте в виду, что оба ``
и system()
блокируются до тех пор, пока программа не завершит выполнение.
Если вы не хотите ждать, или вам нужно зафиксировать как STDOUT / STDERR, так и статус выхода, то вам следует использовать IPC::Open3.
Комментарии:
1. Его лучше использовать
system '/usr/bin/pdf2txt.py', $arg1, $arg2
, поскольку это позволит избежать проблем (и опасных багов) с интерполяцией оболочки.2.Вы можете фиксировать как состояние STDOUT, так и состояние выхода с помощью обратных меток, используя
$?
, например:my $output = `/usr/bin/pdf2txt.py arg1 arg2 2>amp;1`;
my $ret = $?;
Ответ №2:
my $output = `/usr/bin/pdf2txt.py arg1 arg2`;
Комментарии:
1. убедитесь, что скрипт является исполняемым (chmod x) и что у него есть надлежащий хэш-код (например, #!/usr/bin/env python).
Ответ №3:
Если вам не нужен вывод скрипта, но вам нужен код возврата, используйте system()
:
...
my $bin = "/usr/bin/pdf2txt.py";
my @args = qw(arg1 arg2 arg3);
my $cmd = "$bin ".join(" ", @args);
system ($cmd) == 0 or die "command was unable to run to completion:n$cmdn";
Комментарии:
1. Не присоединяйтесь к
@args
. Используйтеsystem $bin, @args;
— это позволяет избежать ряда потенциально опасных ошибок.
Ответ №4:
ЕСЛИ вы хотите видеть вывод в режиме реального времени, а не после завершения работы скрипта, добавьте -u после python. пример :
мой $ ret = system(«python -u pdf2txt.py arg1 arg2″);