क्या पायथन में वर्तमान उपयोगकर्ता नाम पाने का एक पोर्टेबल तरीका है?


596

क्या पायथन में वर्तमान उपयोगकर्ता का उपयोगकर्ता नाम पाने का एक पोर्टेबल तरीका है (यानी, एक ऐसा जो लिनक्स और विंडोज दोनों के तहत काम करता है, कम से कम)। यह काम करेगा os.getuid:

>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'

मैं इधर-उधर घूमता रहा और निश्चित उत्तर न मिलने पर आश्चर्यचकित था (हालाँकि शायद मैं केवल खराब तरीके से गुगली कर रहा था)। लोक निर्माण विभाग मॉड्यूल इस के तहत, लिनक्स को प्राप्त, कहने के लिए एक अपेक्षाकृत आसान तरीका प्रदान करता है, लेकिन यह विंडोज पर मौजूद नहीं है। कुछ खोज परिणामों ने सुझाव दिया कि विंडोज के तहत उपयोगकर्ता नाम प्राप्त करना कुछ परिस्थितियों में जटिल हो सकता है (जैसे, विंडोज सेवा के रूप में चल रहा है), हालांकि मैंने इसे सत्यापित नहीं किया है।


यह मेरे लिनक्स बॉक्स पर काम नहीं करता है!
रिकार्डो

4
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosयाimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
चो

os Python मॉड्यूल में getusername () मान्य विधि नहीं है: docs.python.org/2.7/library/os.html
मैट ब्रूज़ेक

17
@MattBruzek कि ओपी बिंदु वहाँ था। वह कल्पना कर रहा था कि अगर ऐसा अस्तित्व में हो तो इस तरह के समारोह को कैसे बुलाया जा सकता है।
प्रहार करें

जवाबों:


836

पर देखो getpass मॉड्यूल

import getpass
getpass.getuser()
'kostya'

उपलब्धता: यूनिक्स, विंडोज


पीएस प्रति टिप्पणी नीचे " यह फ़ंक्शन उपयोगकर्ता नाम निर्धारित करने के लिए विभिन्न पर्यावरण चर के मूल्यों को देखता है। इसलिए, इस फ़ंक्शन को अभिगम नियंत्रण उद्देश्यों (या संभवतः किसी अन्य उद्देश्य) पर निर्भर नहीं किया जाना चाहिए, क्योंकि यह किसी भी उपयोगकर्ता को किसी अन्य को प्रतिरूपण करने की अनुमति देता है। ) "


100
ऐसा प्रतीत होता है कि यह फ़ंक्शन उपयोगकर्ता नाम निर्धारित करने के लिए विभिन्न पर्यावरण चर के मूल्यों को देखता है। इसलिए, इस फ़ंक्शन को अभिगम नियंत्रण उद्देश्यों (या संभवतः किसी अन्य उद्देश्य के लिए) पर भरोसा नहीं किया जाना चाहिए, क्योंकि यह किसी भी उपयोगकर्ता को किसी अन्य को प्रतिरूपण करने की अनुमति देता है)।
ग्रेग हेवगिल

25
Getpass.getuser () के साथ कुछ भी गलत नहीं है, क्योंकि उपयोगकर्ता को प्रमाणित करने का दावा नहीं करता है। फ़ंक्शन का उद्देश्य यह निर्धारित करना है कि उपयोगकर्ता सीधे उपयोगकर्ता से पूछे बिना कौन होने का दावा कर रहा है।
वाकर हेल IV

7
यदि आपने कोई su किया है तो यह काम नहीं करता है। $ echo $ USER hithwen $ su julia पासवर्ड: $ echo $ USER जूलिया $ python >>> आयात गेटपास >>> getpass.getuser () 'hithwen'
hithwen

6
@GregHewgill एक बहुत अच्छी बात उठाती है, लेकिन वास्तव में, उपयोगकर्ता को सरल तरीके से अनधिकृत तरीके से खोजने पर इस तरह के कुछ अनुप्रयोग होते हैं। मेरा वर्तमान उपयोग-मामला: बाद में आसान सफाई के लिए उपयोगकर्ता नाम के साथ कुछ साझा परीक्षण संसाधनों को टैग करना। (इसलिए यह पता लगाना आसान है कि किसकी गंदगी किसकी है।)
ड्रिफ्टकैचर 16'13

16
और मैं अभिगम नियंत्रण उद्देश्यों के लिए @GregHewgill से सहमत हूं, लेकिन 'किसी अन्य उद्देश्य' से पूरी तरह असहमत हूं - यह कहने जैसा है कि "शेल स्क्रिप्ट में $ USER का उपयोग न करें"। अभिगम नियंत्रण लेकिन देखते हैं के बारे में महान बात बहुत सारे अन्य उपयोगों कि प्रमाणन शामिल नहीं है की।
नेवेलिस

119

आप के os.getuid()साथ गठबंधन करने के लिए सबसे अच्छा शर्त होगा pwd.getpwuid():

import os
import pwd

def get_username():
    return pwd.getpwuid( os.getuid() )[ 0 ]

अधिक जानकारी के लिए pwd डॉक्स देखें:

http://docs.python.org/library/pwd.html


51
वैकल्पिक रूप से (पढ़ने के लिए थोड़ा अच्छा) pwd.getpwuid(os.getuid()).pw_name:।
ब्रायन एम। हंट

6
यह विंडोज पर क्या करता है? शायद कोई यह कोशिश कर सकता है, और अगर यह विफल हो जाता है, तो भद्दे 'गेटपास / एनवी वर्' तरीकों पर वापस आ जाओ।
जोनाथन हार्टले

2
यदि आपको लॉग इन करने और बिना लॉग इन करने की आवश्यकता है, तो यह सही तरीका है।
डेरिक झांग

5
@ जोनाथनहार्टले:ImportError: No module named pwd
जस्टिन

1
यह विधि यूनिक्स जैसी प्रणालियों पर कॉन्स्टेंटिन तेनजिन के उत्तर से बहुत बेहतर है, क्योंकि यह sudoमामले को सही ढंग से संभालती है। (मुझे पता है कि ओपी दीदी नहीं है; यूनिक्स की तरह ssytems के लिए पूछें।)
हल्लोलेओ

86

आप भी उपयोग कर सकते हैं:

 os.getlogin()

29
Linux पर, getlogin () प्रक्रिया के नियंत्रण टर्मिनल पर लॉग इन किए गए उपयोगकर्ता का नाम देता है। इसलिए यह विफल रहता है जब कोई mod_python एप्लिकेशन में कोई नियंत्रित टर्मिनल नहीं होता है, जैसे।
वेब्जर्न लोजोसा

23
विंडोज के लिए उपलब्ध नहीं
वॉकर हेल IV

3
यदि आपने su का उपयोग किया है, तो यह वर्तमान उपयोगकर्ता को वापस नहीं लौटाएगा, लेकिन मूल रूप से उपयोगकर्ता में लॉग इन है।
ट्रेवर एल्ड्रेड

4
खिड़कियों पर काम करता है ... पायथन 3.4.1 (v3.4.1: c0e311e010fc, 18 मई 2014, 10:38:22) [MSC v.1600 32 बिट (Intel)] win32 पर "सहायता", "कॉपीराइट" टाइप करें। अधिक जानकारी के लिए "क्रेडिट" या "लाइसेंस"। >>> आयात ओएस; os.getlogin () 'jrb'
Naib

5
यह केवल Python 3.x के लिए विंडोज पर उपलब्ध है।
ज़िट्रैक्स

70

आप शायद उपयोग कर सकते हैं:

os.environ.get('USERNAME')

या

os.environ.get('USER')

लेकिन यह सुरक्षित नहीं होने वाला है क्योंकि पर्यावरण चर को बदला जा सकता है।


18
os.getenv(...)के पक्ष में पदावनत किया जाता है os.environ[...]
माइक ग्राहम

11
यह USERNAME के ​​बजाय USER नहीं होना चाहिए?
कार्ल बार्टल

7
@ मायकेग्राम os.getenvको पदावनत नहीं लगती ..?
dbr

4
हां, बिल्कुल USER vs USERNAME बिल्कुल वही है जो पोर्टेबल नहीं है, इसलिए यह सही उत्तर नहीं देता है।
पीटर एम

2
USERNAME विंडोज के लिए है, USER लिनक्स के लिए है
सबरीना

22

ये काम कर सकते हैं। मुझे नहीं पता कि सेवा के रूप में चलने पर वे कैसे व्यवहार करते हैं। वे पोर्टेबल नहीं हैं, लेकिन यह है कि क्या os.nameऔर ifबयान के लिए कर रहे हैं।

win32api.GetUserName()

win32api.GetUserNameEx(...) 

देखें: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html


30
यह उत्तर कम से कम उतना ही उपयोगी है जितना कि (बेकार) 25-वोट अपवित्र यूनिक्स-केवल उत्तर।
टॉम बी

3
> "कम से कम उपयोगी के रूप में" सहमत। संभवत: सही उत्तर दो का एक संयोजन है।
जोनाथन हार्टले

यदि आप विंडोज पर अजगर 2 पर अटक गए हैं, तो यह ऐसा करने का एकमात्र सुरक्षित तरीका है। अन्य सभी तरीकों को SET USERNAME=FAKEआपके अजगर आदेश से पहले चलाकर धोखा दिया जा सकता है
कोडकिड

21

यदि आपको उपयोगकर्ता के घर को प्राप्त करने के लिए इसकी आवश्यकता है, तो नीचे एक मानक पुस्तकालय का हिस्सा पोर्टेबल (win32 और linux कम से कम) माना जा सकता है।

>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'

इसके अलावा आप केवल अंतिम पथ घटक (यानी उपयोगकर्ता नाम) प्राप्त करने के लिए इस तरह के स्ट्रिंग को पार्स कर सकते हैं।

देखें: os.path.expanduser


9
किसी के घर की निर्देशिका हमेशा उनके उपयोगकर्ता नाम को प्रतिबिंबित नहीं करती है।
ड्रीमलैक्स

यह लिनक्स और विंडोज
सबरीना

दुर्भाग्यवश, यदि आप Windows में गृह चर सेट करते हैं, तो यह उस मान को लौटा देगा।
GLRoman

15

मेरे लिए osमॉड्यूल का उपयोग करना पोर्टेबिलिटी के लिए सबसे अच्छा लगता है: लिनक्स और विंडोज दोनों पर सबसे अच्छा काम करता है।

import os

# Gives user's home directory
userhome = os.path.expanduser('~')          

print "User's home Dir: " + userhome

# Gives username by splitting path based on OS
print "username: " + os.path.split(userhome)[-1]           

आउटपुट:

खिड़कियाँ:

उपयोगकर्ता का होम डिर: C: \ Users \ myuser

उपयोगकर्ता नाम: myuser

लिनक्स:

उपयोगकर्ता के घर डिर: / रूट

उपयोगकर्ता नाम: जड़

किसी भी मॉड्यूल या एक्सटेंशन को स्थापित करने की आवश्यकता नहीं है।


16
यह समाधान चतुर है, लेकिन कुछ धारणाएं बनाता है जो हमेशा सच नहीं होती हैं। ऐसा कोई अवरोध नहीं है जिसके लिए उपयोगकर्ता नाम की आवश्यकता होती है जो कि लिनक्स पर होमेडिर पथ में दिखाई दे। यह ज्यादातर समय ऐसा ही होता है, लेकिन एक sysadmin उपयोगकर्ता के होमडायर को जो चाहे कर सकता है।
जो होलोवे

गृह चर सेट करना इस पराजित करता है।
GLRoman

11

संयुक्त pwdऔर getpassदृष्टिकोण, अन्य उत्तरों के आधार पर:

try:
  import pwd
except ImportError:
  import getpass
  pwd = None

def current_user():
  if pwd:
    return pwd.getpwuid(os.geteuid()).pw_name
  else:
    return getpass.getuser()

9

UNIX के लिए, कम से कम, यह काम करता है ...

import commands
username = commands.getoutput("echo $(whoami)")
print username

संपादित करें: मैंने अभी इसे देखा और यह विंडोज और यूनिक्स पर काम करता है:

import commands
username = commands.getoutput("whoami")

UNIX पर यह आपका उपयोगकर्ता नाम लौटाता है, लेकिन Windows पर, यह आपके उपयोगकर्ता के समूह, आपके उपयोगकर्ता नाम, स्लैश को लौटा देता है।

-

अर्थात

UNIX रिटर्न: "उपयोगकर्ता नाम"

विंडोज रिटर्न: "डोमेन / उपयोगकर्ता नाम"

-

यह दिलचस्प है, लेकिन शायद आदर्श नहीं है जब तक आप टर्मिनल में कुछ भी नहीं कर रहे हैं ... जिस स्थिति में आप शायद os.systemशुरू करने के लिए उपयोग कर रहे हैं। उदाहरण के लिए, कुछ समय पहले मुझे अपने उपयोगकर्ता को एक समूह में जोड़ने की आवश्यकता थी, इसलिए मैंने ऐसा किया (यह लिनक्स में है, आप पर ध्यान दें)

import os
os.system("sudo usermod -aG \"group_name\" $(whoami)")
print "You have been added to \"group_name\"! Please log out for this to take effect"

मुझे लगता है कि यह पढ़ना आसान है और आपको pwd या गेटपास आयात नहीं करना है।

मुझे यह भी लगता है कि "डोमेन / उपयोगकर्ता" विंडोज में कुछ अनुप्रयोगों में सहायक हो सकता है।


1
domain/usergroup/user
वाइंडोज़

4
कमांड मॉड्यूल विंडोज पर काम नहीं करता है। यह एक UNIX विशिष्ट मॉड्यूल है ( docs.python.org/2/library/commands.html देखें )। अब इसे हटा दिया गया है और इसके बजाय उपप्रकार की सिफारिश की गई है। user = subprocess.check_output("whoami").replace("\r\n", "")
कनेक्टेडसिस्टम


2 टिप्पणी। एक अलग उपयोगकर्ता नाम के तहत चल रही सेवा के संदर्भ में भी कमांड। यानी chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid मेरे साथ कोई नहीं मिला । दूसरा, user = subprocess.check_output("whoami").strip() ऊपर दिए गए प्रतिस्थापन की तुलना में अधिक पोर्टेबल है। commandsबनाम subprocess
नाइटपिकी

5

मैंने कुछ समय पहले यूनिक्स और विंडोज पर (अन्य बातों के अलावा): http://www.decalage.info/en/python/plx पर उपयोगकर्ता नाम प्राप्त करने के लिए plx मॉड्यूल लिखा था

उपयोग:

import plx

username = plx.get_username()

(यह विंडोज पर win32 एक्सटेंशन की आवश्यकता है)


4

केवल मानक अजगर लिबास का उपयोग करना:

from os import environ,getcwd
getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"]
user = getUser()

विंडोज, मैक या लिनक्स पर काम करता है

वैकल्पिक रूप से, आप तत्काल मंगलाचरण के साथ एक पंक्ति निकाल सकते हैं:

from os import environ,getcwd
user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])()

1
getpass भी एक मानक lib है
jodag

win10 में मेरे लिए काम नहीं करता, python3.7.4। 'USER' के बारे में इसकी शिकायत मुझे लगता है कि एनवायरमेंटल वैरिएबल में नहीं मिल रही है। मुझे लगता है कि गेटपास वैसे भी एक बेहतर विकल्प है।
रीका

3

तुम्हें पता है, Windows API से गुज़रते हुए विंडोज पर वर्तमान उपयोगकर्ता नाम प्राप्त कर सकते हैं, हालांकि यह थोड़ा बोझिल ctypes FFI के माध्यम से लागू करने की है ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid )।

मैंने एक छोटा मॉड्यूल लिखा है जो इसे सीधे पायथन, getuser.py से कर सकता है । उपयोग:

import getuser
print(getuser.lookup_username())

यह विंडोज और * निक्स दोनों पर काम करता है (उत्तरार्द्ध pwdमॉड्यूल का उपयोग करता है जैसा कि अन्य उत्तरों में वर्णित है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.