web-dev-qa-db-fra.com

python: raise child_exception, OSError: [Errno 2] Aucun fichier ou répertoire de ce type

J'exécute une commande en python en utilisant la fonction subprocess.popen () suivante:

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)

Dans le shell, cela fonctionne sans erreur, mais en python, je reçois:

  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

J'ai cherché l'erreur mais aucune d'elles n'a résolu mon problème. Est-ce que quelqu'un sait quelle est la cause de ce problème? Merci.

13
Shang Wang

Si vous voulez transmettre la commande sous forme de chaîne à Popen et si les commandes contiennent des tuyaux vers d'autres commandes, vous devez utiliser le mot clé Shell=True.

Je ne suis pas particulièrement familier avec la commande omp, mais cela sent terriblement comme une utilisation inutile de chat. Je pense qu'une meilleure façon d'y parvenir serait de:

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)

Ou, si ce n'est pas une utilisation inutile de cat (vous avez vraiment besoin de diriger le fichier via stdin), vous pouvez aussi le faire avec un sous-processus:

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

Cette erreur s’est aussi produite pour moi aussi avec les scripts Tox. Il s’avère qu’un virtualenv est créé avec Tox, qui a un chemin absolu d’une longueur d’environ 96 caractères, est une erreur d'invocation, OSError2.

'ERROR: l'invocation a échoué (errno 2), OSError: [Errno 2] Aucun fichier ou répertoire de ce type'

Python: Python 2.7.6 Virtualenv: 15.1.0 Toxic: 2.9.1 Pip: 9.0.1 avec py27, py35 chacun

Résolution: J'ai créé mon virtualenv (avec abs path <= (96-100) caractères) où Tox a été installé, cloné mon projet pour l'utiliser avec cette installation tox et virtualenv, tox le crée maintenant et utilise virtualenv bien.

j'espère que ça aide.

0
gaurav arora