Я использовал 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 больше года теперь).
Проблема состоит в том что:
p
объект, который указывает, что ошибка произошлаЯ попробовал check_call
без любого успеха также...
Я в замешательстве относительно того, что я должен сделать и был бы очень рад, если кто-то мог бы или указать на мою ошибку или направить меня к разрешению...
Править:
РЕДАКТИРОВАНИЕ 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>
) и нужно также отметить, что у меня есть немного проблемы при передаче параметров в...
Спасибо.
Через некоторое время с Лиспом вы больше не замечаете круглые скобки, так что ваш пример два встречается как иметь кучу ненужных пробелов в конце. Более конкретно, большинство лисперов используют редактор, который знает о скобках и заботится о правильном закрытии форм, таким образом, вам как разработчику не нужно совпадать с открывающими и закрывающими скобками, как, например, в C.
Что касается того, должна ли последняя форма быть
(* n (factorial (- n 1)))
или
(* n
(factorial (- n 1)))
, которая в основном сводится к личным предпочтениям и сколько вещей происходит в коде (В этом случае я бы предпочел первый только потому, что так мало происходит в коде).
-121--1141097-Потому что нет необходимости выстраивать закрывающие части. Семантически ничего не добавляет. Чтобы узнать, сколько закрыть, большинство Лисперов используют хороший редактор, такой как Emacs, который соответствует parens для закрытия parens и, следовательно, делает задачу тривиальной.
В Python вообще нет закрывающих пар или ключевых слов end
, и Pythonistas живут просто прекрасно.
Я наконец-то нашел ответ на свой вопрос, благодаря 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...
Попробуйте следующее:
p = subprocess.Popen(command,
shell = True, #is this even needed?
stdin = subprocess.PIPE,
stdout = subprocess.PIPE,
# stderr = subprocess.STDOUT #uncomment if reqd
)
Протестирована работа в Windows с помощью команды ping
. Это позволяет общаться
, что может помочь вам выяснить, почему скрипт не запущен :)