2010-12-09 14 views
18

Wenn ich eine Datei wie zu erstellen:Python os.getlogin Problem

import os 
print os.getlogin() 

und es mit cron, erhalte ich eine Ausnahme

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

Wenn ich es manuell in der Schale laufen - es funktioniert .

Problem ist, GitPython 0.3.1 in commit() verwendet diese Funktion, und ich muss es verwenden.

Gibt es eine Problemumgehung?

Ich habe es auf Ubuntu10.10/python2.6.6 und Debian5.0.6/python2.5.2 getestet.

Antwort

34

Von der os.getlogin()docs: "Gibt den Benutzer an das kontrollierende Terminal des Prozesses angemeldet." Ihr Skript verfügt über kein steuerndes Terminal, wenn es von cron ausgeführt wird. Die Dokumentation fährt fort: "Für die meisten Zwecke ist es sinnvoller, die Umgebungsvariable LOGNAME zu verwenden, um herauszufinden, wer der Benutzer ist, oder pwd.getpwuid(os.getuid())[0], um den Anmeldenamen der aktuell gültigen Benutzer-ID abzurufen."

Da Sie GitPython nicht ändern möchten, können Sie ein Skript schreiben, das dies tut: wenn

import os, pwd 

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

import git 

# do whatever you need to do with GitPython here 

Ich würde einen Fehler vorschlagen Einreichung (oder besser noch, einen Patch einreichen) mit GitPython.

+0

Ja, die Frage war über Workarounds) Manuell bearbeiten fremdes Paket ist die letzte Sache, die ich tun möchte) – gistart

+0

Ah, OK. Ich habe einen Vorschlag hinzugefügt, um das zu adressieren, indem ich das 'os' Modul affe-patchen. – kindall

+2

Eine einfachere Alternative zur Verwendung des 'pwd'-Moduls könnte [' getpass.getuser() '] sein (https://docs.python.org/2/library/getpass.html#getpass.getuser) –

0

Hier ist eine ungetestete Vermutung über eine Problemumgehung, die funktionieren könnte: os.getlogin() ruft getlogin() in der C-Bibliothek auf, die wiederum den Anmeldenamen im utmp-Datensatz nach dem aktuellen Prozess sucht. Da es keinen utmp-Eintrag für cron ist, könnten Sie versuchen, einen erstellen

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

in Ihrer crontab. Vielleicht müssen Sie mit den Optionen sessreg herumspielen. Und lassen Sie mich wissen, wenn das wirklich funktionierte, wenn Sie es versuchten :)