Помогите с переносом инструмента командной строки в Python

1

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

$ spooky -a 4 -b .97

Моя первая попытка оболочки Python для призраков выглядела так:

import subprocess

start = "4"
end = ".97"

spooky_path = '/Users/path/to/spooky'
cmd = [spooky_path, '-a', start, '-b', end]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
process.wait()
print('Done')

Вышеприведенный код печатает Done, но не выполняет программу spooky

Затем я попытался просто выполнить программу в командной строке следующим образом:

$ /Users/path/to/spooky -a 4 -b .97

Вышеупомянутый код также терпит неудачу и не дает никаких полезных ошибок.

Мой вопрос: как я могу заставить Python запускать эту программу, отправив spooky -a 4 -b.97 в командную строку? Я ОЧЕНЬ высоко ценю любую помощь, которую вы можете предоставить. Заранее спасибо.

  • 0
    Сначала вы должны выяснить, почему не работает последний вызов командной строки. Если вы не решили эту проблему, вам не нужно думать о своем подходе к Python. Какие «полезные ошибки» выдает ваш вызов из командной строки?
  • 2
    ... поэтому он запускается, когда вы просто spooky , а не когда вы указываете ему полный путь ... очевидная причина в том, что полный путь неверен.
Показать ещё 4 комментария
Теги:
wrapper
subprocess

2 ответа

3
Лучший ответ

Вам нужно удалить stdout = subprocess.PIPE. Делая это, отключите стандартный вывод вашего процесса из stdout Python и сделайте его доступным с помощью функции Popen.communicate(), например:

import subprocess

spooky_path = 'ls'
cmd = [spooky_path, '-l']
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
output = process.communicate()[0]
print "Output:", output
process.wait()
print('Done')

Чтобы распечатать его напрямую, вы можете использовать его без аргумента stdout:

process = subprocess.Popen(cmd)

Или вы можете использовать функцию вызова:

process = subprocess.call(cmd)
  • 0
    Вау, это на самом деле работает !!! Я не совсем уверен, что понимаю, почему ваш код работает, учитывая, что у меня были проблемы только с одним командным инструментом? В любом случае, большое спасибо за помощь.
  • 1
    Вероятно, это работало заранее, вы просто не видели результат, потому что он был передан по каналу, и вы не отображали его или даже не пытались получить его.
0

Попробуйте сделать вашу команду в одну строку:

cmd = 'spooky_path -a start -b end'
process = subprocess.Popen(cmd, shell=True)
  • 0
    Это просто скажет вам, что нет исполняемого файла "spooky_path -a start -b end" .
  • 0
    К сожалению, когда программа заработает, мне нужно будет использовать Python для многократного выполнения этих команд с разными значениями -b .
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню