Подпроцесс Python не может получить вывод команды оракула "Imp" - PullRequest
1 голос
/ 08 апреля 2011

Например:

import subprocess
p=subprocess.Popen("imp -help",stdout=subprocess.PIPE,stdin=subprocess.PIPE)
out,err=p.communicate

выход null

но другие команды оракула, такие как "sqlplus -help", "rman -help" работают нормально

1 Ответ

1 голос
/ 08 апреля 2011

Могут быть две проблемы, почему вы не получаете вывод в stdout:

  1. Процесс выводит весь свой вывод в stderr.
  2. Система не знает, как выполнить "imp -help".

Решение первой проблемы простое: захватить stderr с помощью аргумента stderr = subprocess.PIPE.

Решение второго также легко, но объяснение немного длиннее: подпроцесс не много догадывается, он просто попытается выполнить всю строку одной командой. Это означает, что в вашем случае он попытается выполнить "imp -help" как одну команду. Он не пытается выполнить команду "imp" с аргументом "-help". Вы должны явно указать подпроцессу команду и аргументы отдельно.

Из питона Документация на подпроцесс:

аргументы должны быть строкой или последовательностью аргументов программы. Программа для Выполнение обычно является первым элементом в последовательность аргументов или строка, если задана строка, ...

Это означает, что вы должны разделить команду и аргументы и упаковать их вместе в последовательности. Это: "imp -help" должно выглядеть так: ["imp", "-help"]. Прочтите документацию для подпроцесса, чтобы узнать больше о тонкостях разделения команды и аргументов.

Вот как должен выглядеть код:

import subprocess
p=subprocess.Popen(["imp", "-help"],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    stdin=subprocess.PIPE)
out,err=p.communicate()

Примечание: вы также набрали p.communicate вместо p.communicate(). Я предполагаю, что это была опечатка в вашем вопросе, а не в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...