Отладка подпроцесса. Вызов Popen

Я использовал subprocess.Popen успешно в прошлом при обертывании двоичных файлов со сценарием Python для форматирования аргументы / настраивают и т.д...

Разрабатывая энную обертку, я сделал как обычный..., но ничего не происходит.

Вот небольшой код:

print command
p = subprocess.Popen(command, shell = True)
result = p.communicate()[0]
print vars(p)
return result

И вот вывод:

/usr/bin/sh /tmp/run/launch.sh
{'_child_created': True, 'returncode': 0, 'stdout': None, 'stdin': None, 'pid': 21650, 'stderr': None, 'universal_newlines': False}

Как Вы видите, цель состоит в том, чтобы создать сценарий оболочки, настраивающий все, в чем я нуждаюсь, и затем выполнение ее. Я предпочел бы использовать реальный код Python, но к сожалению launch.sh назовите сторонние сценарии оболочки, которые у меня нет желания попытаться копировать (хотя я настаивал для API Python больше года теперь).

Проблема состоит в том что:

  • сценарий оболочки не выполняется (он должен породить процесс и произвести некоторые небольшие вещи),
  • никакое исключение Python не повышено
  • нет ничего в p объект, который указывает, что ошибка произошла

Я попробовал check_call без любого успеха также...

Я в замешательстве относительно того, что я должен сделать и был бы очень рад, если кто-то мог бы или указать на мою ошибку или направить меня к разрешению...

Править:

  • Попытка выполнить это на Linux (sh)
  • оболочка необходима для подстановки переменных в вызванных сценариях

РЕДАКТИРОВАНИЕ 2:

Следующее badp предложение, я настроил код и добавил

subprocess.Popen('ps', shell = True).communicate()

Прямо после p = ... строка, которая создает процесс, вот является выводом:

/usr/bin/sh /tmp/run/launch.sh
  PID TTY          TIME CMD
29978 pts/0    00:00:01 zsh
 1178 pts/0    00:00:01 python
 1180 pts/0    00:00:00 sh <defunct>
 1181 pts/0    00:00:00 ps
None

По-видимому, процесс запускается (даже при том, что <defunct>) и нужно также отметить, что у меня есть немного проблемы при передаче параметров в...

Спасибо.

8
задан Matthieu M. 5 February 2010 в 10:44
поделиться

2 ответа

Через некоторое время с Лиспом вы больше не замечаете круглые скобки, так что ваш пример два встречается как иметь кучу ненужных пробелов в конце. Более конкретно, большинство лисперов используют редактор, который знает о скобках и заботится о правильном закрытии форм, таким образом, вам как разработчику не нужно совпадать с открывающими и закрывающими скобками, как, например, в C.

Что касается того, должна ли последняя форма быть

(* n (factorial (- n 1)))

или

(* n
   (factorial (- n 1)))

, которая в основном сводится к личным предпочтениям и сколько вещей происходит в коде (В этом случае я бы предпочел первый только потому, что так мало происходит в коде).

-121--1141097-

Потому что нет необходимости выстраивать закрывающие части. Семантически ничего не добавляет. Чтобы узнать, сколько закрыть, большинство Лисперов используют хороший редактор, такой как Emacs, который соответствует parens для закрытия parens и, следовательно, делает задачу тривиальной.

В Python вообще нет закрывающих пар или ключевых слов end , и Pythonistas живут просто прекрасно.

-121--1141096-

Я наконец-то нашел ответ на свой вопрос, благодаря badp и его предложениям по отладке.

На странице python модуля подпроцесса :

Аргумент executable указывает исполняемую программу. Это очень редко требуется: Обычно программа для выполнения определяется аргументом args. Если shell = True , аргумент исполняемого файла указывает, какую оболочку использовать. В Unix оболочкой по умолчанию является /bin/sh . В Windows оболочка по умолчанию задается переменной среды COMSPEC . Единственная причина, по которой необходимо указать shell = True в Windows, заключается в том, что команда, которую требуется выполнить, фактически встроена в оболочку, например, dir , copy . Для запуска пакетного файла и консольного исполняемого файла не требуется shell = True .

Поскольку я нахожусь в Linux и использую shell = True , моя команда фактически представляет собой список аргументов, которые должны выполняться исполняемым файлом , по умолчанию /bin/sh . Таким образом, была выполнена полная команда: /bin/sh/usr/bin/sh/tmp/run/launch.sh ... что не так хорошо сработало.

И я должен был использовать либо:

subprocess.Popen('/tmp/run/launch.sh', shell=True)

или

subprocess.Popen('/tmp/run/launch.sh', executable = '/usr/bin/sh', shell=True)

Это сложно, что shell = True фактически изменить значение по умолчанию исполняемый файл только в Linux...

5
ответ дан 5 December 2019 в 18:59
поделиться

Попробуйте следующее:

p = subprocess.Popen(command,
                     shell = True, #is this even needed?
                     stdin = subprocess.PIPE,
                     stdout = subprocess.PIPE,
                   # stderr = subprocess.STDOUT #uncomment if reqd
                    )

Протестирована работа в Windows с помощью команды ping. Это позволяет общаться, что может помочь вам выяснить, почему скрипт не запущен :)

.
4
ответ дан 5 December 2019 в 18:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: