Problema al implementar git add / commit en el module sh python

Estoy experimentando el siguiente comportamiento extraño con git del module sh python:

Aquí está el script de python:

import sh from datetime import datetime now = str(datetime.now()) filename = "config.cfg" file = filename f = open(file, 'w') f.write(now) now = str(datetime.now()) comment = "-m " + "\"new version" + " registrenetworking " + now + "\"" print(sh.sudo.git("add", filename)) print(sh.sudo.git("commit", comment)) 

COMPORTAMIENTO: Manualmente todo funciona bien:

 $ echo "new content" > config.cfg $ git add config.cfg $ sudo git commit -m "ospf configuration registrenetworking 2014-10-24 15:30:33.531963" [master 142cfd5] ospf configuration registrenetworking 2014-10-24 15:30:33.531963 1 file changed, 1 insertion(+) 

Pero no la implementación a través del module python sh

I – ### La 1ra ejecución está bien

 python sh1.py [master 6d13519] "new version registrenetworking 2014-10-24 15:37:42.534595" 1 file changed, 1 deletion(-) 

II – ### cualquier ejecución posterior da lo siguiente:

 python sh1.py Traceback (most recent call last): File "sh1.py", line 24, in <module> print(sh.sudo.git("commit", comment)) File "/home/user/anaconda/lib/python2.7/site-packages/sh.py", line 769, in __call__ return RunningCommand(cmd, call_args, stdin, stdout, stderr) File "/home/user/anaconda/lib/python2.7/site-packages/sh.py", line 330, in __init__ self.wait() File "/home/user/anaconda/lib/python2.7/site-packages/sh.py", line 334, in wait self._handle_exit_code(self.process.wait()) File "/home/user/anaconda/lib/python2.7/site-packages/sh.py", line 348, in _handle_exit_code self.process.stderr sh.ErrorReturnCode_1: RAN: '/usr/bin/sudo git commit -m "new version registrenetworking 2014-10-24 15:38:02.528213"' STDOUT: On branch master Untracked files: sh1.py nothing added to commit but untracked files present STDERR: 

III- ### todo funciona bien después de agregar y confirmar manualmente:

 $ sudo git add config.cfg $ sudo git commit -m "new version registrenetworking 2014-10-24 15:34:35.2415245" [master 5d5fe35] new version registrenetworking 2014-10-24 15:34:35.2415245 1 file changed, 1 insertion(+) 

Y ahora vuelvo al primer comportamiento I, y así sucesivamente …


El usuario está en sudoers y configura NOPASSWD para evitar la contraseña de sudo

Debe cerrar el object de file antes de invocar los commands de git.

 f.close() 

Si ejecutó el "estado de git", verá que Git se quejaba de que, después de ejecutar el script, config.cfg todavía tenía cambios que no se habían configurado para la confirmación.

Tengo la sensación de que Python arroja un carácter EOF o algo al file cuando está cerrado, y por lo tanto altera el file desde que llamaste 'git add' desde tu script. Desafortunadamente, no estoy seguro, solo que el problema se resolvió para mí cuando cerré el file antes de 'git add' 'git commit' del script.

Editar: Inútil me ha corregido y señaló que la razón es porque el file está almacenado en el búfer.