Подтвердить что ты не робот

Это правильный способ запустить оболочку 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
4b9b3361

Ответ 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()), а не как строка аргумента, оцениваемая оболочкой, он также очень безопасен, поскольку инъекция команд оболочки невозможна.