Có cách di động nào để lấy tên người dùng hiện tại trong Python không?


597

Có cách nào di động để lấy tên người dùng hiện tại bằng Python (ít nhất là một cách hoạt động trong cả Linux và Windows). Nó sẽ hoạt động như os.getuidsau:

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

Tôi googled xung quanh và ngạc nhiên khi không tìm thấy một câu trả lời dứt khoát (mặc dù có lẽ tôi chỉ đang googling kém). Các pwd mô-đun cung cấp một cách tương đối dễ dàng để đạt được dưới này, nói, Linux, nhưng nó không phải là hiện nay trên Windows. Một số kết quả tìm kiếm cho thấy việc lấy tên người dùng trong Windows có thể phức tạp trong một số trường hợp nhất định (ví dụ: chạy như một dịch vụ Windows), mặc dù tôi chưa xác minh điều đó.


Nó không hoạt động trên hộp Linux của tôi!
Riccardo

5
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecoshoặcimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
chown

getusername () không phải là phương pháp hợp lệ trong os Python module: docs.python.org/2.7/library/os.html
Matt Bruzek

17
@MattBruzek Đó là điểm của OP ở đó. Ông đang tưởng tượng làm thế nào một chức năng như vậy có thể được gọi nếu nó tồn tại.
chọc

Câu trả lời:


836

Nhìn vào mô-đun getpass

import getpass
getpass.getuser()
'kostya'

Sẵn có: Unix, Windows


ps Per bình luận bên dưới " hàm này xem xét các giá trị của các biến môi trường khác nhau để xác định tên người dùng. Do đó, chức năng này không nên dựa vào mục đích kiểm soát truy cập (hoặc có thể là bất kỳ mục đích nào khác, vì nó cho phép bất kỳ người dùng nào mạo danh bất kỳ người dùng nào khác ). "


100
Dường như hàm này xem xét các giá trị của các biến môi trường khác nhau để xác định tên người dùng. Do đó, chức năng này không nên được dựa vào cho các mục đích kiểm soát truy cập (hoặc có thể là bất kỳ mục đích nào khác, vì nó cho phép bất kỳ người dùng nào mạo danh bất kỳ người nào khác).
Greg Hewgill

25
Không có gì sai với getpass.getuser (), vì không yêu cầu xác thực người dùng. Mục đích của chức năng là xác định người dùng đang tuyên bố là ai mà không hỏi trực tiếp người dùng.
Walker Hale IV

7
Điều đó không hiệu quả nếu bạn đã thực hiện một su. $ echo $ USER hithwen $ su julia Mật khẩu: $ echo $ USER julia $ python >>> nhập getpass >>> getpass.getuser () 'hithwen'
hithwen

6
@GregHewgill nêu lên một điểm rất tốt, nhưng thực sự, việc tìm ra tên người dùng theo cách đơn giản không được xác thực như thế này có một số ứng dụng. Trường hợp sử dụng hiện tại của tôi: gắn thẻ một số tài nguyên thử nghiệm được chia sẻ với tên người dùng để dễ dàng dọn dẹp sau này. (Vì vậy, dễ dàng hơn để tìm ra ai là người gây rối.)
driftcatcher

16
Và tôi đồng ý với @GregHewgill cho các mục đích kiểm soát truy cập, nhưng hoàn toàn không đồng ý với 'bất kỳ mục đích nào khác' - giống như nói "Đừng sử dụng $ USER trong tập lệnh shell". Điểm tuyệt vời về kiểm soát truy cập nhưng có rất nhiều ứng dụng khác không liên quan đến auth.
nevelis

119

Bạn nên đặt cược tốt nhất là kết hợp os.getuid()với pwd.getpwuid():

import os
import pwd

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

Tham khảo tài liệu pwd để biết thêm chi tiết:

http://docs.python.org/l Library / pwd.html


51
Ngoài ra (hơi đẹp hơn để đọc) : pwd.getpwuid(os.getuid()).pw_name.
Brian M. Hunt

6
Nó làm gì trên Windows? Có lẽ người ta có thể thử điều này, và nếu thất bại, hãy quay lại với các phương thức 'getpass / env var' tào lao.
Jonathan Hartley

2
Đây là cách chính xác nếu bạn cần lấy tên người dùng cả có và không đăng nhập.
Derrick Zhang

5
@JonathanHartley:ImportError: No module named pwd
Justin

1
Phương pháp này nằm trên các hệ thống giống như unix vượt trội hơn nhiều so với câu trả lời của Konstantin Tenzin, vì nó xử lý sudotrường hợp này một cách chính xác. (Tôi biết rằng OP đã không yêu cầu ssytems giống như unix.)
halloleo

86

Bạn cũng có thể dùng:

 os.getlogin()

29
Trên linux, getlogin () trả về tên của "người dùng đã đăng nhập trên thiết bị đầu cuối kiểm soát của quá trình." Do đó, nó không thành công khi không có thiết bị đầu cuối kiểm soát, ví dụ, trong ứng dụng mod_python.
Vebjorn Ljosa

23
Không khả dụng cho Windows
Walker Hale IV

3
Nếu bạn đã sử dụng su, thì điều này sẽ không trả về người dùng hiện tại, nhưng người dùng đã đăng nhập ban đầu.
Trevor Allred

4
không hoạt động trên windows ... Python 3.4.1 (v3.4.1: c0e311e010fc, ngày 18 tháng 5 năm 2014, 10:38:22) [MSC v.1600 32 bit (Intel)] trên win32 Loại "trợ giúp", "bản quyền", "Tín dụng" hoặc "giấy phép" để biết thêm thông tin. >>> nhập os; os.getlogin () 'jrb'
Naib

5
Nó chỉ khả dụng trên Windows cho Python 3.x.
Zitrax

71

Bạn có thể sử dụng:

os.environ.get('USERNAME')

hoặc là

os.environ.get('USER')

Nhưng nó sẽ không an toàn vì các biến môi trường có thể được thay đổi.


18
os.getenv(...)được phản đối ủng hộ os.environ[...].
Mike Graham

11
Không phải là USER thay vì USERNAME?
Karl Bartel

7
@MikeGraham os.getenvdường như không được tán thành ..?
dbr

4
Đúng, chính xác USER vs USERNAME chính xác là những gì không thể mang theo được, vì vậy nó không cung cấp câu trả lời chính xác.
Peter M

2
USERNAME dành cho Windows, USER dành cho Linux
Sabrina

22

Đây có thể làm việc. Tôi không biết họ cư xử thế nào khi chạy như một dịch vụ. Chúng không phải là di động, nhưng đó là những gì os.nameiftuyên bố là dành cho.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

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


30
Câu trả lời này ít nhất cũng hữu ích như câu trả lời 25 phiếu bầu vô dụng (vô dụng).
Tom B

3
> "Ít nhất là hữu ích" Đồng ý. Có lẽ câu trả lời đúng là sự kết hợp của cả hai.
Jonathan Hartley

Nếu bạn bị mắc kẹt trên python 2 trên Windows, đây là cách an toàn duy nhất để làm điều đó. Tất cả các cách khác có thể bị lừa bằng cách chạy SET USERNAME=FAKEtrước lệnh python của bạn
CodeKid

21

Nếu bạn đang cần điều này để có được thư mục nhà của người dùng, dưới đây có thể được coi là di động (ít nhất là win32 và linux), một phần của thư viện chuẩn.

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

Ngoài ra, bạn có thể phân tích chuỗi như vậy để chỉ nhận thành phần đường dẫn cuối cùng (ví dụ: tên người dùng).

Xem: os.path.Exanduser


9
Thư mục nhà của ai đó không phải lúc nào cũng phản ánh tên người dùng của họ.
dreamlax

Điều này hoạt động trên cả Linux và Windows
Sabrina

Thật không may, nếu bạn đặt biến HOME trong Windows, điều này sẽ trả về giá trị đó.
GLRoman

15

Đối với tôi, việc sử dụng osmô-đun có vẻ tốt nhất cho tính di động: Hoạt động tốt nhất trên cả Linux và Windows.

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]           

Đầu ra:

Các cửa sổ:

Nhà của người dùng Dir: C: \ Users \ myuser

tên người dùng: myuser

Linux:

Nhà của người dùng Dir: / root

tên người dùng: root

Không cần cài đặt bất kỳ mô-đun hoặc phần mở rộng.


16
Giải pháp này rất thông minh, nhưng đưa ra một số giả định không phải lúc nào cũng đúng. Không có ràng buộc nào yêu cầu tên người dùng xuất hiện trong đường dẫn homedir trên Linux. Nó chỉ xảy ra trong hầu hết thời gian, nhưng một sysadmin có thể đặt homedir của người dùng thành bất cứ điều gì họ muốn.
Joe Holloway

Đặt biến HOME đánh bại điều này.
GLRoman

11

Kết hợp pwdgetpasstiếp cận, dựa trên các câu trả lời khác:

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

Đối với UNIX, ít nhất, điều này hoạt động ...

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

chỉnh sửa: Tôi vừa tìm nó và nó hoạt động trên Windows và UNIX:

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

Trên UNIX, nó trả về tên người dùng của bạn, nhưng trên Windows, nó trả về nhóm người dùng của bạn, gạch chéo, tên người dùng của bạn.

-

I E

UNIX trả về: "tên người dùng"

Windows trả về: "tên miền / tên người dùng"

-

Điều đó thật thú vị, nhưng có lẽ không lý tưởng trừ khi bạn đang làm gì đó trong thiết bị đầu cuối ... dù trong trường hợp nào bạn có thể sẽ sử dụng os.systemđể bắt đầu. Ví dụ, trước đây tôi cần thêm người dùng của mình vào một nhóm, vì vậy tôi đã làm (đây là trong Linux, nhớ bạ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"

Tôi cảm thấy như thế dễ đọc hơn bạn không phải nhập pwd hoặc getpass.

Tôi cũng cảm thấy việc có "miền / người dùng" có thể hữu ích trong một số ứng dụng nhất định trong Windows.


1
domain/user Không trả lại tiềngroup/user
RealHowTo 4/11/14

4
Mô-đun lệnh không hoạt động trên Windows. Đây là một mô-đun cụ thể của UNIX (xem docs.python.org/2/l Library / common.html ). Bây giờ nó không dùng nữa và thay vào đó nên sử dụng quy trình con. user = subprocess.check_output("whoami").replace("\r\n", "")
ConnectedSystems

k; sau đó sử dụng quy trình con ... jeez
dylnmc

2 nhận xét. Command.whoami đã làm rất tốt, ngay cả trong bối cảnh dịch vụ chạy dưới tên người dùng khác. tức là với chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid tôi chẳngai . thứ hai, user = subprocess.check_output("whoami").strip() là di động hơn so với các nguồn cấp thay thế ở trên. commandsvs subprocesscó vẻ nitpicky nhưng các lệnh bị thiếu từ python 3.
JL Peyret

5

Tôi đã viết mô-đun plx một thời gian trước để có được tên người dùng theo cách di động trên Unix và Windows (trong số những thứ khác): http://www.decalage.info/en/python/plx

Sử dụng:

import plx

username = plx.get_username()

(nó yêu cầu tiện ích mở rộng win32 trên Windows)


4

Chỉ sử dụng libs python tiêu chuẩn:

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

Hoạt động trên Windows, Mac hoặc Linux

Ngoài ra, bạn có thể xóa một dòng bằng một lời gọi ngay lập tức:

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

1
getpass cũng là một lib tiêu chuẩn
jodag

không hoạt động với tôi trong win10, python3.7.4. Tôi phàn nàn về 'NGƯỜI DÙNG' không được tìm thấy trong các biến môi trường tôi đoán. Tôi đoán getpass là một lựa chọn tốt hơn dù sao.
Rika

3

Bạn có thể lấy tên người dùng hiện tại trên Windows bằng cách đi qua các API Windows, mặc dù đó là một chút rườm rà để gọi qua ctypes FFI ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccount ).

Tôi đã viết một mô-đun nhỏ có thể thực hiện điều này trực tiếp từ Python, getuser.py . Sử dụng:

import getuser
print(getuser.lookup_username())

Nó hoạt động trên cả Windows và * nix (cái sau sử dụng pwdmô-đun như được mô tả trong các câu trả lời khác).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.