Как выполнить скрипт из Python с параметрами - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно выполнить следующую команду через python.

/work/data/get_info name=Mike home

Я получаю ошибку No such file or directory: '/work/data/get_info name=Mike home'. Что не правильно. программа get_info завершает работу. Он работает в Perl-скрипте, я пытаюсь получить ту же функциональность в Python.

скрипт Perl

$ENV{work} = '/work/data';
my $myinfo = "$ENV{work}/bin/get_info";
$info = `$myinfo name=Mike home`;

Информация выводит информацию

мой скрипт на питоне

import os, subprocess

os.environ['work'] = '/work/data'
run_info = "{}/bin/get_info name={} {}".format(os.environ['work'],'Mike','home')
p = subprocess.call([run_product_info], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()

Я получаю сообщение об ошибке No such file or directory: '/work/data/get_info name=Mike

1 Ответ

0 голосов
/ 12 апреля 2019

Python subprocess.call думает, что вся строка - это имя программы, как если бы вы дважды заключили его в кавычки, как "/work/data/get_info name=Mike home", так как вы передали его как массив.

Либо передайте его безмассив для оболочки (если вы уверены, что все экранирование / цитирование правильные и видите предупреждения в документации) или передаете каждый из них как отдельный элемент массива.

subprocess.call(['/work/data/bin/get_info', 'name=Mike', 'home'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.call('/work/data/bin/get_info name=Mike home', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

https://docs.python.org/3.7/library/subprocess.html#frequently-used-arguments

args требуется для всех вызовов и должен быть строкой или последовательностью аргументов программы.Предоставление последовательности аргументов обычно является предпочтительным, поскольку оно позволяет модулю позаботиться о любом необходимом экранировании и цитировании аргументов (например, чтобы разрешить пробелы в именах файлов).Если передается одна строка, либо shell должен иметь значение True (см. Ниже), либо строка должна просто указывать имя программы, которая должна быть выполнена, без указания каких-либо аргументов.

...