2010-12-09 11 views
18

si creo un archivo como:Python problema os.getlogin

import os 
print os.getlogin() 

y ejecutarlo con cron, consigo una excepción

print os.getlogin() 
OSError: [Errno 22] Invalid argument 

Si funciono de forma manual en el shell - funciona .

El problema es que GitPython 0.3.1 en commit() usa esta función y necesito usarla.

¿Hay alguna solución?

Lo he probado en Ubuntu10.10/python2.6.6 y Debian5.0.6/python2.5.2.

Respuesta

34

Del os.getlogin()docs: "Devuelve el usuario que inició sesión en el terminal de control del proceso". Su secuencia de comandos no tiene un terminal de control cuando se ejecuta desde cron. Los documentos continúan sugiriendo: "Para la mayoría de los propósitos, es más útil usar la variable de entorno LOGNAME para averiguar quién es el usuario, o pwd.getpwuid(os.getuid())[0] para obtener el nombre de usuario del ID de usuario actualmente vigente".

Puesto que usted no desea modificar GitPython, se podría escribir un script que hace esto:

import os, pwd 

os.getlogin = lambda: pwd.getpwuid(os.getuid())[0] 

import git 

# do whatever you need to do with GitPython here 

que sugeriría la presentación de un error (o mejor aún, la presentación de un parche) con GitPython, sin embargo.

+0

Sí, la pregunta era sobre soluciones) Editar manualmente paquete extranjero es lo último que quiero hacer) – gistart

+0

Ah, OK. He agregado una sugerencia para abordar eso mediante el parche de mono del módulo 'os'. – kindall

+2

una alternativa más simple al uso del módulo 'pwd' podría ser [' getpass.getuser() '] (https://docs.python.org/2/library/getpass.html#getpass.getuser) –

0

Aquí hay una suposición no probada sobre una reparación que podría funcionar: os.getlogin() llama a getlogin() en la biblioteca C, que a su vez busca el nombre de usuario en el registro utmp correspondiente al proceso actual. Dado que no existe un registro utmp para cron, usted podría intentar crear uno usando

sessreg -a <logname> ; do_stuff ; sessreg -d <logname> 

en su crontab. Tal vez tenga que juguetear con las opciones sessreg. Y avíseme si esto realmente funcionó si lo intentó :)