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
Я искал ошибку, но ни одна из них не решила мою проблему. Кто-нибудь знает, в чем причина этой проблемы? Спасибо.
Ответы
Ответ 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 сейчас, и он отлично работает.
надеюсь, что это поможет.