2010-12-09 23 views
18

तो मैं की तरह एक फ़ाइल बनाने:अजगर os.getlogin समस्या

import os 
print os.getlogin() 

और क्रॉन के साथ इसे चलाने के लिए, मैं एक अपवाद

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

अगर मैं यह खोल में मैन्युअल रूप से चलाना है - यह काम करता है ।

समस्या यह है कि गिटपथन 0.3.1 प्रतिबद्ध() में इस फ़ंक्शन का उपयोग करता है, और मुझे इसका उपयोग करने की आवश्यकता है।

क्या कोई कामकाज है?

मैंने इसे उबंटू 10.10/पायथन 2.6.6 और डेबियन 5.0.6/पायथन 2.5.2 पर परीक्षण किया है।

उत्तर

34

os.getlogin()docs से: "उपयोगकर्ता को प्रक्रिया के नियंत्रण टर्मिनल में लॉग इन करता है।" cron से चलते समय आपकी स्क्रिप्ट में नियंत्रण टर्मिनल नहीं होता है। दस्तावेज़ इस बात पर सुझाव देते हैं: "अधिकांश प्रयोजनों के लिए, वर्तमान में प्रभावी उपयोगकर्ता आईडी का लॉगिन नाम प्राप्त करने के लिए उपयोगकर्ता कौन है, या pwd.getpwuid(os.getuid())[0] पर्यावरण परिवर्तनीय LOGNAME का उपयोग करना अधिक उपयोगी है।"

जब से तुम GitPython संशोधित करने के लिए नहीं करना चाहते, आप एक स्क्रिप्ट है कि यह करता है लिख सकते हैं:

import os, pwd 

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

import git 

# do whatever you need to do with GitPython here 

मैं एक बग दाखिल (या बेहतर अभी तक, एक पैच प्रस्तुत करने) GitPython साथ, हालांकि सुझाव है।

+0

हाँ, सवाल कामकाज के बारे में था) मैन्युअल रूप से विदेशी पैकेज संपादित करना आखिरी चीज़ है जो मैं करना चाहता हूं) – gistart

+0

आह, ठीक है। मैंने 'os' मॉड्यूल बंदर-पैचिंग द्वारा संबोधित करने के लिए एक सुझाव जोड़ा है। – kindall

+2

'pwd' मॉड्यूल का उपयोग करने का एक आसान विकल्प हो सकता है ['getpass.getuser()'] (https://docs.python.org/2/library/getpass.html#getpass.getuser) –

0

यहां काम के आसपास एक अनचाहे अनुमान है जो काम कर सकता है: os.getlogin() सी पुस्तकालय में getlogin() पर कॉल करता है, जो बदले में वर्तमान प्रक्रिया के अनुरूप utmp रिकॉर्ड में लॉगिन नाम देखता है। चूंकि क्रॉन के लिए कोई utmp रिकॉर्ड नहीं है, इसलिए आप

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

अपने क्रोंटैब में एक बनाने का प्रयास कर सकते हैं। शायद आपको sessreg विकल्पों के साथ घूमना होगा। और अगर आप इसे आजमाते हैं तो यह वास्तव में काम करता है :)