Это правильный способ запустить оболочку script внутри Python?
import subprocess
retcode = subprocess.call(["/home/myuser/go.sh", "abc.txt", "xyz.txt"])
Когда я запустил эти две строки, буду ли я делать именно это?:
/home/myuser/go.sh abc.txt xyz.txt
Почему я получаю эту ошибку? Но когда я запускаю go.sh нормально, я не получаю эту ошибку.
File "/usr/lib/python2.6/subprocess.py", line 480, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
raise child_exception
OSError: [Errno 8] Exec format error
Ответы
Ответ 1
OSError: [Errno 8] Ошибка формата Exec
Это ошибка, сообщаемая операционной системой при попытке запустить /home/myuser/go.sh
.
Мне кажется, что строка shebang (#!
) go.sh
недопустима.
Здесь образец script, который запускается из оболочки, но не из Popen
:
#\!/bin/sh
echo "You've just called $0 [email protected]"
Удаление \
из первой строки устраняет проблему.
Ответ 2
Измените код следующим образом:
retcode = subprocess.call(["/home/myuser/go.sh", "abc.txt", "xyz.txt"], shell=True,)
Обратите внимание: "shell = True"
От: http://docs.python.org/library/subprocess.html#module-subprocess
В Unix с оболочкой = True: если args является string, он задает команду строка для выполнения через оболочку. Это означает, что строка должна быть отформатирован точно так же, как и когда введенный в командной строке.
Ответ 3
Недавно я столкнулся с этой проблемой с script, которая выглядела так:
% cat /tmp/test.sh
<-- Note the empty line
#!/bin/sh
mkdir /tmp/example
script отлично справился с командной строкой, но с
OSError: [Errno 8] Exec format error
при выполнении через
subprocess.Popen(['/tmp/test.sh']).communicate()
(Разумеется, решение заключалось в удалении пустой строки).
Ответ 4
Да, это прекрасно, если все, что вы делаете, вызывает оболочку script, ожидая ее завершения, и собирает ее статус выхода, позволяя stdin, stdout и stderr наследоваться от вашего процесса Python. Если вам нужно больше контролировать какой-либо из этих факторов, вы просто используете более общий subprocess.Popen
, но в противном случае у вас все в порядке.
Ответ 5
Я только что получил эту ошибку в Mac OS, пытаясь вызвать однострочный script с помощью subprocess.call
. script отлично работает при вызове из командной строки. После добавления строки shebang #!/usr/bin/env sh
он также отлично работал с помощью subprocess.call
.
Появляется, в то время как у оболочки есть исполнитель по умолчанию для текстовых файлов, помеченных как исполняемый, subprocess.Popen
не работает.
Ответ 6
In :call??
Signature: call(*popenargs, **kwargs)
Source:
def call(*popenargs, **kwargs):
"""Run command with arguments. Wait for command to complete, then
return the returncode attribute.
The arguments are the same as for the Popen constructor. Example:
retcode = call(["ls", "-l"])
"""
return Popen(*popenargs, **kwargs).wait()
File: /usr/lib64/python2.7/subprocess.py
Type: function
вызов просто вызывает Popen, используйте метод wait(), чтобы завершить всплывающие окна
Ответ 7
Да, это предпочтительный способ выполнить что-то..
Поскольку вы передаете все аргументы через массив (который будет использоваться во внутреннем вызове gor-exec()), а не как строка аргумента, оцениваемая оболочкой, он также очень безопасен, поскольку инъекция команд оболочки невозможна.