2008-08-30 9 views
5

J'essaie d'utiliser svnmerge.py pour fusionner certains fichiers. Sous le capot, il utilise python, et quand je l'utilise, je reçois une erreur - "Le système ne trouve pas le fichier spécifié". Les collègues au travail exécutent la même version de svnmerge.py, et de python (2.5.2, en particulier r252: 60911) sans problème."Le système ne trouve pas le fichier spécifié" lors de l'appel du sous-processus.Popen en python

J'ai trouvé this link, qui décrit mon problème. Essayer ce qui était il décrit, je confirme Python pourrait trouver svn (il est dans mon chemin):

 
P:\>python 
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> i,k = os.popen4("svn --version") 
>>> i.close() 
>>> k.readline() 
'svn, version 1.4.2 (r22196)\n' 

En regardant le code svnmerge.py, cependant, j'ai remarqué pour les versions de Python 2.4 et plus, il est à la suite d'une exécution différente chemin. Plutôt que d'appeler os.popen4(), il utilise subprocess.Popen(). Essayer qui reproduit l'erreur:

 
C:\>python 
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> p = subprocess.Popen("svn --version", stdout=subprocess.PIPE, 
>>> close_fds=False, stderr=subprocess.PIPE) 
Traceback (most recent call last): 
    File "", line 1, in 
    File "C:\Python25\lib\subprocess.py", line 594, in __init__ 
    errread, errwrite) 
    File "C:\Python25\lib\subprocess.py", line 816, in _execute_child 
    startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 
>>> 

Pour l'instant, je l'ai commenté le code spécifique de 2,4 et plus, mais je voudrais trouver une solution appropriée.

Si ce n'est pas évident, je suis un débutant python complet, mais google n'a pas aidé. Des pointeurs?

Répondre

13

C'est un bug, voir le documentation of subprocess.Popen. Il doit soit être une option "shell=True ", ou le premier argument doit être une séquence ['svn', '--version']. Comme il est maintenant, Popen est à la recherche d'un exécutable nommé, littéralement," svn --version "qu'il ne trouve pas

Je ne sais pas pourquoi cela fonctionnerait pour vos collègues si, s'ils exécutent le même système d'exploitation et la même version de Python ... FWIW, il me donne le même message d'erreur sur un mac, et l'une des deux façons a donné des corrections.