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

Python: raise child_exception, OSError: [Errno 2] Нет такого файла или каталога

Я выполняю команду в python, используя функцию subprocess.popen(), как показано ниже:

omp_cmd = 'cat %s | omp -h %s -u %s -w %s -p %s -X -' %(temp_xml, self.host_IP, self.username, self.password, self.port)
xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT)

В оболочке он отлично работает без ошибок, но в python я получаю:

  File "/home/project/vrm/apps/audit/models.py", line 148, in sendOMP
    xmlResult = Popen(omp_cmd, stdout=PIPE, stderr=STDOUT)
  File "/usr/local/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/local/lib/python2.7/subprocess.py", line 1228, in _execute_child
    raise child_exception
  OSError: [Errno 2] No such file or directory

Я искал ошибку, но ни одна из них не решила мою проблему. Кто-нибудь знает, в чем причина этой проблемы? Спасибо.

4b9b3361

Ответ 1

Если вы собираетесь передать команду в виде строки в Popen, и если в командах есть трубы для других команд, вам нужно использовать ключевое слово shell=True.

Я не особенно знаком с командой omp, но это очень неприятно, как бесполезное использование кошки. Я бы подумал, что лучший способ достичь этого будет:

import shlex
omp_cmd = 'omp -h %s -u %s -w %s -p %s -X %s' %(self.host_IP, self.username, self.password, self.port, temp_xml)
xmlResult = Popen(shlex.split(omp_cmd), stdout=PIPE, stderr=STDOUT)

Или, если это не бесполезное использование cat (вам действительно нужно передать файл через stdin), вы также можете сделать это с помощью подпроцесса:

import shlex
omp_cmd = 'omp -h %s -u %s -w %s -p %s -X -' %(self.host_IP, self.username, self.password)
with open(temp_xml) as stdin:
    xmlResult = Popen(shlex.split(omp_cmd), stdin=stdin, stdout=PIPE, stderr=STDOUT)

Ответ 2

Эта ошибка также произошла для меня тоже с помощью точных скриптов, оказывается, что virtualenv создается с помощью тождества, у которого есть asolute path длиной около 96 символов, но всякий раз, когда он принимает ваш абсолютный путь "bin/pip" примерно до 123 chars, есть ошибка вызова, OSError2.

'ОШИБКА: сбой вызова (errno 2), OSError: [Errno 2] Нет такого файла или каталога '

Python: Python 2.7.6 virtualenv: 15.1.0 ток: 2,9,1 pip: 9.0.1 ubuntu 14.04 тест проходил с охватом: тесты django (1,8-1,11) с py27, py35 каждый

Разрешение: Я создал свой virtualenv (с символом abs path <= (96-100)), сначала там, где установлен ток, клонированный мой проект, который будет использоваться с этой установкой токсичности, и virtualenv, tox создает его собственные virtualenvs сейчас, и он отлично работает.

надеюсь, что это поможет.