পাইথনে বর্তমান ব্যবহারকারীর নামটি পাওয়ার কোনও পোর্টেবল উপায় আছে কি?


596

পাইথনে বর্তমান ব্যবহারকারীর ব্যবহারকারীর নাম পাওয়ার কোনও পোর্টেবল উপায় রয়েছে (অর্থাত্ লিনাক্স এবং উইন্ডোজ উভয়ের অধীনে কাজ করে এমন একটি)) এটি কাজ করবে os.getuid:

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

আমি চারপাশে googled এবং একটি নির্দিষ্ট উত্তর না পেয়ে অবাক (যদিও সম্ভবত আমি খারাপভাবে গুগল করছি)। PWD মডিউল এই অধীনে, লিনাক্স অর্জন বলতে একটি অপেক্ষাকৃত সহজ উপায় প্রদান করে, কিন্তু এটি Windows এ উপস্থিত নেই। কিছু অনুসন্ধান ফলাফল বলেছিল যে উইন্ডোজের অধীনে ব্যবহারকারীর নাম পাওয়া নির্দিষ্ট পরিস্থিতিতে জটিল হতে পারে (যেমন, উইন্ডোজ পরিষেবা হিসাবে চলমান), যদিও আমি এটি যাচাই করে নি।


এটি আমার লিনাক্স বাক্সে কাজ করে না!
রিকার্ডো

4
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosঅথবাimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
chown

getusername () ওএস পাইথন মডিউলে বৈধ পদ্ধতি নয়: ডকস.পাইথন.আর.
ম্যাট ব্রুজেক

17
@ ম্যাটব্রুজেক এটি ওপির মূল বিষয় ছিল। তিনি ভাবছিলেন যে এই জাতীয় অনুষ্ঠানের অস্তিত্ব থাকলে কীভাবে ডাকা যেতে পারে।
অকর্মা

উত্তর:


836

এ লুক getpass মডিউল

import getpass
getpass.getuser()
'kostya'

উপলভ্যতা: ইউনিক্স, উইন্ডোজ


পিএস নীচে কমেন্টের "" এই ফাংশনটি ব্যবহারকারীর নাম নির্ধারণ করতে বিভিন্ন পরিবেশের ভেরিয়েবলের মানগুলি দেখায় Therefore সুতরাং, অ্যাক্সেস নিয়ন্ত্রণের উদ্দেশ্যে (অথবা সম্ভবত অন্য কোনও উদ্দেশ্যে) এই ফাংশনটির উপর নির্ভর করা উচিত নয় যেহেতু এটি কোনও ব্যবহারকারীকে অন্য কোনও ছদ্মবেশ তৈরি করার অনুমতি দেয় ) "


100
এটি প্রদর্শিত হয় যে এই ফাংশনটি ব্যবহারকারীর নাম নির্ধারণ করতে বিভিন্ন পরিবেশের ভেরিয়েবলের মানগুলি দেখায়। অতএব, অ্যাক্সেস নিয়ন্ত্রণের উদ্দেশ্যে (বা সম্ভবত অন্য কোনও উদ্দেশ্য হিসাবে এই ফাংশনটির উপর নির্ভর করা উচিত নয়, যেহেতু এটি কোনও ব্যবহারকারীকে অন্য কোনও ছদ্মবেশ তৈরি করতে দেয়)।
গ্রেগ হিউগিল

25
Getpass.getuser () এর সাথে কোনও ভুল নেই, যেহেতু ব্যবহারকারীকে প্রমাণীকরণের দাবি করে না। ফাংশনটির উদ্দেশ্য হ'ল ব্যবহারকারীটি সরাসরি ব্যবহারকারীকে জিজ্ঞাসা না করে কারা দাবি করছেন তা নির্ধারণ করা।
ওয়াকার হেল চতুর্থ

7
আপনি যদি মামলা করেন তবে তা কাজ করে না। cho প্রতিধ্বনি $ ব্যবহারকারী হিথউইন $ সু জুলিয়া পাসওয়ার্ড: $ প্রতিধ্বনি $ ব্যবহারকারী জুলিয়া $ অজগর >>> আমদানি গেটপাস >>> getpass.getuser () 'হিথউইন'
হিটওয়েন

6
@ গ্রেগ হিউগিল একটি খুব ভাল পয়েন্ট উত্থাপন করেছে, তবে প্রকৃতপক্ষে, ব্যবহারকারীর নামটি একটি সাধারণ অ-প্রত্যক্ষ পদ্ধতিতে সন্ধান করার মতো কিছু অ্যাপ্লিকেশন রয়েছে। আমার বর্তমান ব্যবহার-কেস: পরে পরিষ্কার-পরিচ্ছন্নতার জন্য কিছু ব্যবহারকারীর নাম দিয়ে ভাগ করা পরীক্ষার সংস্থানগুলিতে ট্যাগ করা। (সুতরাং
কার গণ্ডগোল কার কার

16
এবং আমি অ্যাক্সেস নিয়ন্ত্রণের উদ্দেশ্যে @ গ্রেগ হিউগিলের সাথে একমত, তবে 'অন্য কোনও উদ্দেশ্য' - এর সাথে সম্পূর্ণরূপে একমত নই - এটি "শেল স্ক্রিপ্টে $ USER ব্যবহার করবেন না" বলার মতো। অ্যাক্সেস নিয়ন্ত্রণ সম্পর্কে দুর্দান্ত পয়েন্ট তবে প্রচুর অন্যান্য ব্যবহার রয়েছে যা লেখককে জড়িত করে না।
নেভেলিস

119

আপনি সবচেয়ে ভাল বাজি os.getuid()সাথে একত্রিত করা হবে pwd.getpwuid():

import os
import pwd

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

আরও বিশদের জন্য পিডাব্লুডি ডক্স দেখুন:

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


51
বিকল্পভাবে (সামান্য সুন্দর পড়তে): pwd.getpwuid(os.getuid()).pw_name
ব্রায়ান এম হান্ট

6
এটি উইন্ডোজে কী করে? সম্ভবত কেউ এটি চেষ্টা করতে পারে এবং যদি এটি ব্যর্থ হয় তবে ক্রেপি 'গেটপাস / এনভিভি ভার' পদ্ধতিতে ফিরে যান।
জোনাথন হার্টলি

2
লগ ইন করা বা না করেই আপনার ব্যবহারকারীর নাম নেওয়া দরকার হলে এটি সঠিক উপায়
ডেরিক জাং

5
@ জোনাথন হার্টলি:ImportError: No module named pwd
জাস্টিন

1
এই পদ্ধতিটি ইউনিক্সের মতো সিস্টেমে কনস্ট্যান্টিন টেনজিনের উত্তরের চেয়ে অনেক বেশি উন্নত, কারণ এটি কেসটি sudoসঠিকভাবে পরিচালনা করে । (আমি অবগত আছি যে ওপি ইউনিক্সের মতো সংক্রমণের জন্য জিজ্ঞাসা করে না))
হ্যালোলিও

86

আপনি এটি ব্যবহার করতে পারেন:

 os.getlogin()

29
লিনাক্সে, getlogin () "প্রক্রিয়াটির নিয়ন্ত্রণকারী টার্মিনালে লগ ইন করা ব্যবহারকারীর নাম প্রদান করে।" সুতরাং কোনও নিয়ন্ত্রণকারী টার্মিনাল না থাকলে এটি ব্যর্থ হয়, উদাহরণস্বরূপ, একটি Mod_python অ্যাপ্লিকেশনটিতে।
Vebjorn Ljosa

23
উইন্ডোজের জন্য উপলভ্য নয়
ওয়াকার হেল চতুর্থ

3
আপনি যদি su ব্যবহার করেন তবে তা বর্তমান ব্যবহারকারীকে ফিরিয়ে দেবে না, তবে মূলত লগ ইন করা ব্যবহারকারী।
ট্রেভর অলরেড

4
উইন্ডোজে কাজ করে ... পাইথন ৩.৪.১ (v3.4.1: c0e311e010fc, মে 18 2014, 10:38:22) [উইন 32 এ এমএসসি v.1600 32 বিট (ইন্টেল)] "সহায়তা", "কপিরাইট", আরও তথ্যের জন্য "ক্রেডিট" বা "লাইসেন্স"। >>> ওএস আমদানি করুন; os.getlogin () 'jrb'
নায়েব

5
এটি পাইথন ৩.x এর জন্য শুধুমাত্র উইন্ডোজে উপলব্ধ
জিট্রাক্স

70

আপনি সম্ভবত ব্যবহার করতে পারেন:

os.environ.get('USERNAME')

অথবা

os.environ.get('USER')

তবে এটি নিরাপদ হবে না কারণ পরিবেশের ভেরিয়েবলগুলি পরিবর্তন করা যেতে পারে।


18
os.getenv(...)পক্ষে হ্রাস করা হয় os.environ[...]
মাইক গ্রাহাম

11
এটি USERNAME এর পরিবর্তে USER হওয়া উচিত নয়?
কার্ল বার্টেল

7
@ মাইকগ্রাহাম অবহেলিত os.getenvবলে মনে হচ্ছে না ..?
dbr

4
হ্যাঁ, ইউএসএল বনাম USERNAME হুবহু পোর্টেবল নয়, তাই এটি সঠিক উত্তর সরবরাহ করে না।
পিটার এম

2
USERNAME উইন্ডোজের জন্য, USER লিনাক্সের জন্য
সাব্রিনা

22

এগুলি কাজ করতে পারে। পরিষেবা হিসাবে চলতে গিয়ে তারা কী আচরণ করে তা আমি জানি না। এগুলি বহনযোগ্য নয়, তবে এগুলি os.nameএবং ifবিবৃতিগুলি।

win32api.GetUserName()

win32api.GetUserNameEx(...) 

দেখুন: http://timgolden.me.uk/python/win32_h__do_i/get-the-owner-of-a-file.html


30
এই উত্তরটি কমপক্ষে (অকেজো) 25-ভোটের আপডভোটড ইউনিক্স-উত্তর হিসাবে কার্যকর।
টম বি

3
> "কমপক্ষে কার্যকর হিসাবে" সম্মত। সম্ভবত সঠিক উত্তরটি দুটিয়ের সংমিশ্রণ।
জোনাথন হার্টলি

আপনি যদি উইন্ডোজ অজগর 2 এ আটকে থাকেন তবে এটি করার একমাত্র নিরাপদ উপায়। SET USERNAME=FAKEআপনার অজগর কমান্ডের আগে চালিয়ে অন্য সমস্ত উপায়
ঠকানো যায়

21

ব্যবহারকারীর বাড়ির দির পেতে যদি আপনার এটির প্রয়োজন হয় তবে নীচেরটিকে বহনযোগ্য হিসাবে বিবেচনা করা যেতে পারে (উইন 32 এবং লিনাক্স কমপক্ষে), একটি স্ট্যান্ডার্ড লাইব্রেরির অংশ।

>>> 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]           

আউটপুট:

উইন্ডোজ:

ব্যবহারকারীর বাড়ি দির: সি: \ ব্যবহারকারী \ মাইউসার

ব্যবহারকারীর নাম: myuser

লিনাক্স:

ব্যবহারকারীর বাড়ি দির: / মূল

ব্যবহারকারীর নাম: রুট

কোনও মডিউল বা এক্সটেনশান ইনস্টল করার প্রয়োজন নেই।


16
এই সমাধানটি চতুর, তবে এমন কিছু অনুমান করা যায় যা সর্বদা সত্য হয় না। লিনাক্সের হোমডির পথে ব্যবহারকারীর নামটির দরকার নেই এমন কোনও বাধা নেই। এটি বেশিরভাগ সময় কেস হিসাবে ঘটে থাকে তবে একটি সিসাদমিন ব্যবহারকারীর হোমডিরকে তারা যা খুশি সেট করতে পারে।
জো হোলোয় 15

হোম ভেরিয়েবল সেট করা এটিকে পরাস্ত করে।
জিএলরোমান

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

ইউনিক্সের জন্য, কমপক্ষে, এটি কাজ করে ...

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

সম্পাদনা করুন: আমি স্রেফ এটি সন্ধান করেছি এবং এটি উইন্ডোজ এবং ইউনিক্সে কাজ করে:

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

ইউনিক্সে এটি আপনার ব্যবহারকারীর নামটি দেয় তবে উইন্ডোজে এটি আপনার ব্যবহারকারীর গ্রুপ, স্ল্যাশ, আপনার ব্যবহারকারীর নামটি দেয় returns

-

আই ই

UNIX ফেরত: "ব্যবহারকারীর নাম"

উইন্ডোজ ফিরে: "ডোমেন / ব্যবহারকারীর নাম"

-

এটি আকর্ষণীয়, তবে সম্ভবত আপনি আদর্শ না হন যদি না আপনি টার্মিনালে কিছু না করে থাকেন ... এই ক্ষেত্রে আপনি সম্ভবত এটি ব্যবহার os.systemশুরু করছিলেন be উদাহরণস্বরূপ, কিছুক্ষণ আগে আমার একটি গ্রুপে আমার ব্যবহারকারী যুক্ত করা দরকার ছিল, তাই আমি এটি করেছি (এটি লিনাক্সে রয়েছে, মনে রাখবেন)

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"

আমার মনে হয় এটি পড়া সহজ এবং আপনাকে পিডব্লিউডি বা গেটপাস আমদানি করতে হবে না।

আমি উইন্ডোজের নির্দিষ্ট অ্যাপ্লিকেশনগুলিতে "ডোমেন / ব্যবহারকারীর" থাকা সহায়ক হতে পারে বলেও মনে করি।


1
domain/usergroup/user
উইন্ডোজগুলি

4
কমান্ড মডিউলটি উইন্ডোজে কাজ করে না। এটি একটি ইউনিক্স নির্দিষ্ট মডিউল ( ডকস.পিথথন.আর / ২ / লাইব্রেরি / কম্যান্ডস এইচটিএমএল দেখুন )। এটি এখন হ্রাস করা হয়েছে এবং পরিবর্তে সাব-প্রসেসের প্রস্তাব দেওয়া হচ্ছে। user = subprocess.check_output("whoami").replace("\r\n", "")
সংযুক্ত

k; তারপরে সাবপ্রসেস ব্যবহার করুন ... জিজ
dylnmc

2 মন্তব্য। কমান্ড.ওমোমি দুর্দান্ত কাজ করেছে, এমনকি কোনও পৃথক ব্যবহারকারীর নামে চলমান একটি পরিষেবা প্রসঙ্গেও। অর্থাত্‍ chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid আমার সাথে কেউ পেল না । দ্বিতীয়টি, user = subprocess.check_output("whoami").strip() উপরের লাইনফিডগুলি প্রতিস্থাপনের চেয়ে আরও পোর্টেবল। commandsবনাম subprocessনিটপিকি বলে মনে হচ্ছে তবে কমান্ডগুলি অজগর 3 থেকে অনুপস্থিত
জেএল পেয়ারেট

5

ইউনিক্স এবং উইন্ডোতে (অন্যান্য জিনিসের মধ্যে) পোর্টেবল উপায়ে ব্যবহারকারীর নাম পাওয়ার জন্য আমি প্ল্যাক্স মডিউলটি কিছু সময় আগে লিখেছিলাম: http://www.decalage.info/en/python/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
গেটপাসটি একটি স্ট্যান্ডার্ড
লিবিও

win10, পাইথন3.7.4 এ আমার জন্য কাজ করে না। এটি 'ইউজার' সম্পর্কে অভিযোগ করে যে অনুমান করা যায় এমন পরিবেশের পরিবর্তনশীলগুলিতে পাওয়া যায় না। আমার ধারণা গেটপাস যাইহোক ভাল পছন্দ।
রিকা

3

আপনি উইন্ডোস API চোখ বুলিয়ে Windows এ বর্তমান ব্যবহারকারীর নাম পেতে পারেন যদিও এটা একটু কষ্টকর ctypes FFI মাধ্যমে ডাকা হচ্ছে ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid )।

আমি একটি ছোট মডিউল লিখেছি যা পাইথন থেকে সরাসরি এটি করতে পারে, getuser.py । ব্যবহার:

import getuser
print(getuser.lookup_username())

এটি উইন্ডোজ এবং * নিক্স উভয় ক্ষেত্রেই কাজ করে (পরবর্তী pwdউত্তরগুলি বর্ণিত মডিউলটি ব্যবহার করে )।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.