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.
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)
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.