Python'da geçerli kullanıcı adını almanın taşınabilir bir yolu var mı?


597

Geçerli kullanıcının kullanıcı adını Python'da almanın taşınabilir bir yolu var mı (en azından hem Linux hem de Windows altında çalışan bir tane). Şöyle çalışır os.getuid:

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

Etrafta googled ve kesin bir cevap bulmak için sürpriz oldu (her ne kadar ben sadece kötü googling rağmen). Pwd modülü, Linux, bu altından başarmak demek nispeten kolay bir yol sağlar, ancak Windows üzerinde mevcut değildir. Arama sonuçlarından bazıları, doğrulamamış olmama rağmen, Windows altında kullanıcı adını almanın belirli durumlarda karmaşık olabileceğini (örneğin, bir Windows hizmeti olarak çalışıyor) önerdi.


Linux kutumda çalışmıyor!
Riccardo

5
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosveyaimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
chown

getusername () os Python modülünde geçerli bir yöntem değil: docs.python.org/2.7/library/os.html
Matt Bruzek

17
@MattBruzek OP'nin buradaki amacı buydu. Böyle bir fonksiyonun var olması halinde nasıl çağrılabileceğini hayal ediyordu.
dürtmek

Yanıtlar:


836

Bak getpass modülü

import getpass
getpass.getuser()
'kostya'

Kullanılabilirlik: Unix, Windows


ps Aşağıdaki açıklama başına " bu işlev, kullanıcı adını belirlemek için çeşitli ortam değişkenlerinin değerlerine bakar. Bu nedenle, bu işlev erişim kontrolü amacıyla (veya muhtemelen başka herhangi bir amaç için kullanılmamalıdır, çünkü herhangi bir kullanıcının başka bir ). "


100
Bu işlevin, kullanıcı adını belirlemek için çeşitli ortam değişkenlerinin değerlerine baktığı görülmektedir. Bu nedenle, bu fonksiyon erişim kontrolü amacıyla (veya herhangi bir kullanıcının başka bir kimliğe bürünmesine izin verdiğinden) başka bir amaca güvenmemelidir.
Greg Hewgill

25
Kullanıcının kimliğini doğruladığını iddia etmediği için getpass.getuser () ile ilgili yanlış bir şey yoktur. Fonksiyonun amacı, kullanıcıya doğrudan sormadan kullanıcının kim olduğunu iddia ettiğini belirlemektir.
Walker Hale IV

7
Bir su yaptıysanız bu işe yaramaz. $ echo $ USER hithwen $ su julia Şifre: $ echo $ USER julia $ python >>> ithalat getpass >>> getpass.getuser () 'hithwen'
hithwen

6
@GregHewgill çok iyi bir noktaya değiniyor, ancak aslında, bazı uygulamaları olduğu gibi kullanıcı adını doğrulanmamış basit bir şekilde bulmak. Mevcut kullanım durumum: daha sonra kolay temizlik için bazı paylaşılan test kaynaklarını bir kullanıcı adıyla etiketleme. (Yani kimin karmaşasının
kim olduğunu bulmak

16
Erişim kontrolü için @GregHewgill ile hemfikirim, ancak 'başka herhangi bir amaç' ile tamamen aynı fikirde değilim - "Kabuk komut dosyasında $ USER kullanmayın" demek gibi. Erişim kontrolü ama orada yaklaşık Büyük nokta bol auth içermeyen diğer kullanımların.
nevelis

119

Sen iyi bahis birleştirmek olacaktır os.getuid()ile pwd.getpwuid():

import os
import pwd

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

Daha fazla bilgi için pwd belgelerine bakın:

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


51
Alternatif olarak (biraz daha güzel okumak için): pwd.getpwuid(os.getuid()).pw_name.
Brian M. Hunt

6
Windows'da ne yapar? Belki biri bunu deneyebilir ve başarısız olursa berbat 'getpass / env var' yöntemlerine geri döner.
Jonathan Hartley

2
Kullanıcı adını hem giriş yaparak hem de giriş yapmadan almanız gerekiyorsa doğru yoldur.
Derrick Zhang

5
@JonathanHartley:ImportError: No module named pwd
Justin

1
Bu yöntem, Konstantin Tenzin'in cevabından çok daha üstün olan unix benzeri sistemlerde , çünkü sudodavayı doğru bir şekilde ele alıyor . (OP'nin farkında olmadığını biliyorum; unix benzeri systems istemeyin.)
halloleo

86

Ayrıca kullanabilirsiniz:

 os.getlogin()

29
Linux'ta getlogin (), "sürecin kontrol terminalinde oturum açan kullanıcı" adını döndürür. Bu nedenle, bir mod_python uygulamasında kontrol terminali olmadığında başarısız olur.
Vebjorn Ljosa

23
Windows için mevcut değil
Walker Hale IV

3
Su kullandıysanız, bu geçerli kullanıcıyı döndürmez, ancak ilk olarak oturum açmış olan kullanıcıyı döndürür.
Trevor Allred

4
Windows üzerinde çalışıyor ... Python 3.4.1 (v3.4.1: c0e311e010fc, 18 Mayıs 2014, 10:38:22) win32'de [MSC v.1600 32 bit (Intel)] tip32'de "help", "copyright", daha fazla bilgi için "kredi" veya "lisans". >>> ithalat işletim sistemi; os.getlogin () 'jrb'
Naib

5
Yalnızca Python 3.x için Windows'ta kullanılabilir.
Zitrax

71

Muhtemelen şunları kullanabilirsiniz:

os.environ.get('USERNAME')

veya

os.environ.get('USER')

Ancak güvenli olmayacaktır çünkü ortam değişkenleri değiştirilebilir.


18
os.getenv(...)lehine itiraz edilmiştir os.environ[...].
Mike Graham

11
USERNAME yerine USER olmamalı mı?
Karl Bartel

7
@MikeGraham reddedilmiş os.getenvgibi görünmüyor ..?
dbr

4
Evet, tam olarak USER vs USERNAME tam olarak taşınabilir olmayan şeydir, bu yüzden doğru cevabı vermez.
Peter M

2
USERNAME Windows, USER Linux için
Sabrina

22

Bunlar işe yarayabilir. Hizmet olarak çalışırken nasıl davrandıklarını bilmiyorum. Taşınabilir değiller, ama bu os.nameve ififadeler bunun için.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

Bkz. Http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html


30
Bu cevap en azından (işe yaramaz) 25 oyla oylanan sadece unix yanıtı kadar faydalıdır.
Tom B

3
> "En azından aynı derecede yararlı" Anlaştı. Muhtemelen doğru cevap bu ikisinin bir kombinasyonudur.
Jonathan Hartley

Windows'ta python 2'ye takılı kalırsanız, bunu yapmanın tek güvenli yolu budur. Diğer tüm yollar SET USERNAME=FAKEpython komutunuzdan önce çalıştırılarak kandırılabilir
CodeKid

21

Kullanıcının ana dizinini almak için buna ihtiyacınız varsa, aşağıda standart bir kütüphanenin parçası olan taşınabilir (en azından win32 ve linux) olarak düşünülebilir.

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

Ayrıca, yalnızca son yol bileşenini (yani kullanıcı adı) almak için bu dizeyi ayrıştırabilirsiniz.

Bakınız: os.path.andanduser


9
Birinin ana dizini her zaman kullanıcı adını yansıtmaz.
dreamlax

Bu hem Linux hem de Windows üzerinde çalışır
Sabrina

Ne yazık ki, Windows'ta HOME değişkenini ayarlarsanız, bu değer bu değeri döndürür.
GLRoman

15

Benim için osmodül kullanmak taşınabilirlik için en iyi görünüyor: Hem Linux hem de Windows için en iyi şekilde çalışır.

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]           

Çıktı:

Pencereler:

Kullanıcının ana sayfası Dir: C: \ Kullanıcılar \ kullanıcım

kullanıcı adı: kullanıcım

Linux:

Kullanıcının ana sayfası Dir: / root

kullanıcı adı: kök

Herhangi bir modül veya uzantı kurmaya gerek yoktur.


16
Bu çözüm akıllıdır, ancak her zaman doğru olmayan bazı varsayımlar yapar. Kullanıcı adının Linux'taki homedir yolunda görünmesini gerektiren bir kısıtlama yoktur. Çoğu zaman böyle olur, ancak bir sistem yöneticisi bir kullanıcının homedirini istediklerine ayarlayabilir.
Joe Holloway

HOME değişkeninin ayarlanması bunu yener.
GLRoman

11

Kombine pwdve getpassdiğer yanıtlara dayalı yaklaşım:

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

En azından UNIX için bu işe yarıyor ...

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

edit: Ben sadece baktı ve bu Windows ve UNIX üzerinde çalışır:

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

UNIX'te kullanıcı adınızı döndürür, ancak Windows'ta kullanıcı grubunuzu, eğik çizgiyi ve kullanıcı adınızı döndürür.

-

IE

UNIX şunu döndürür: "kullanıcı adı"

Windows şunu döndürür: "domain / username"

-

Bu ilginç, ama yine de terminalde bir şey yapmadıkça muhtemelen ideal değil ... bu durumda muhtemelen os.systembaşlamak için kullanacaksınız. Örneğin, bir süre önce kullanıcımı bir gruba eklemem gerekiyordu, bu yüzden yaptım (bu Linux'ta, unutmayın)

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"

Bunun okunması daha kolay ve pwd veya getpass almak zorunda değilsiniz.

Ayrıca "etki alanı / kullanıcı" Windows belirli uygulamalarda yardımcı olabilir gibi hissediyorum.


1
Windows döner domain/user değilgroup/user
RealHowTo

4
Komutlar modülü Windows'ta çalışmaz. UNIX'e özgü bir modüldür (bkz. Docs.python.org/2/library/commands.html ). Artık kullanımdan kaldırılmıştır ve bunun yerine alt işlem önerilir. user = subprocess.check_output("whoami").replace("\r\n", "")
ConnectedSystems

k; sonra alt işlem kullanın ...
jeez

2 açıklama. commands.whoami, farklı bir kullanıcı adı altında çalışan bir hizmet bağlamında bile çok başarılı oldu. ile yani chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid I got kimse . ikinci, user = subprocess.check_output("whoami").strip() yukarıdaki satır besleme yerine daha taşınabilir. commandsvs subprocessnitpicky gibi görünüyor ama python 3'te komutlar eksik
JL Peyret

5

Bir süre önce plix modülünü Unix ve Windows üzerinde taşınabilir bir şekilde almak için yazdım (diğer şeylerin yanı sıra): http://www.decalage.info/en/python/plx

Kullanımı:

import plx

username = plx.get_username()

(Windows'ta win32 uzantıları gerektirir)


4

Yalnızca standart python kütüphanelerini kullanarak:

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

Windows, Mac veya Linux'ta çalışır

Alternatif olarak, acil çağrı ile bir satırı kaldırabilirsiniz:

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

1
getpass da standart bir lib
jodag

win10, python3.7.4'te benim için çalışmıyor. 'USER' ile ilgili şikayeti, çevre değişkenlerinde bulunamadığını düşünüyorum. Getpass zaten daha iyi bir seçim sanırım.
Rika

3

FFI ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid ) aracılığıyla çağırmak biraz zahmetli olsa da, Windows API'sini kullanarak geçerli kullanıcı adını Windows'ta alabilirsiniz .

Bunu doğrudan Python, getuser.py'den yapabilen küçük bir modül yazdım . Kullanımı:

import getuser
print(getuser.lookup_username())

Hem Windows hem de * nix üzerinde çalışır (ikincisi pwdmodülü diğer cevaplarda açıklandığı gibi kullanır ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.