web-dev-qa-db-ja.com

python:child_exceptionを発生、OSError:[Errno 2]そのようなファイルやディレクトリはありません

次のように、subprocess.popen()関数を使用して、pythonでコマンドを実行します。

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

エラーを検索しましたが、どれも私の問題を解決しませんでした。この問題の原因が誰か知っていますか?ありがとう。

18
Shang Wang

コマンドを文字列として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)

または、猫の無駄な使用ではない場合(実際には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)
21
mgilson

このエラーは、toxスクリプトでも発生しました。virtualenvは、約96文字の長さの絶対パスを持つtoxで作成されていますが、絶対的な「bin/pip」パスが約123文字になると、 OSError2の呼び出しエラーです。

「エラー:呼び出しに失敗しました(エラー番号2)、OSエラー:[エラー番号2]そのようなファイルまたはディレクトリはありません」

Python:Python 2.7.6 virtualenv:15.1.0 tox:2.9.1 pip:9.0.1カバレッジで実行された9.0.1 ubuntu 14.04テスト:それぞれpy27、py35を使用したDjango(1.8-1.11)テスト

解決策:最初にtoxがインストールされている場所にvirtualenv(abs path <=(96-100)chars)を作成し、このtoxインストールとvirtualenvで使用するプロジェクトを複製しました。toxは独自のvirtualenvを作成し、正常に実行されます。

それが役に立てば幸い。

0
gaurav arora