web-dev-qa-db-ja.com

Pythonで現在のユーザー名を取得するための移植性のある方法はありますか?

現在のユーザーのユーザー名をPythonで取得するための移植可能な方法はありますか(つまり、少なくともLinuxとWindowsの両方で動作するもの)。 os.getuidのように動作します。

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

私は歩き回って、決定的な答えを見つけられなかったことに驚きました(おそらく私は単にグーグルをやっていなかっただけですが)。 pwd モジュールは、Linuxなどでこれを達成するための比較的簡単な方法を提供しますが、Windowsにはありません。一部の検索結果では、Windows環境でユーザー名を取得するのは、特定の状況(たとえば、Windowsサービスとして実行されている場合など)では複雑になる可能性があることを示唆しています。

529

getpass moduleを見てください。

import getpass
getpass.getuser()
'kostya'

出荷時期:Unix、ウィンドウズ


pS "この関数はさまざまな環境変数の値を調べてユーザー名を決定します。したがって、この関数はアクセス制御の目的(または他の目的のために使用される可能性があります。他の)。"

727

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

99
Liam Chasteen

また使用することができます:

 os.getlogin()
74

あなたはおそらく使用することができます:

os.environ.get('USERNAME')

または

os.environ.get('USER')

しかし、環境変数が変更される可能性があるため、安全ではありません。

59
Nadia Alramli

これらはうまくいくかもしれません。サービスとして実行したときの動作がわかりません。移植性はありませんが、それが "os.name"と "if"ステートメントの目的です。

win32api.GetUserName()

win32api.GetUserNameEx(...)

参照してください: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

20
Adam

ユーザの自宅のディレクトリを取得するためにこれが必要な場合は、以下が標準ライブラリの一部である移植性(少なくともwin32とlinux)と見なされる可能性があります。

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

また、このような文字列を解析して最後のパスコンポーネント(つまりユーザー名)のみを取得することもできます。

参照してください: os.path.expanduser

18
HezniK

私にとってosモジュールを使うことは移植性のために最も良く見えます:Linuxと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]           

出力:

Windows:

ユーザーの自宅ディレクトリ:C:\ Users\myuser

ユーザー名:myuser

Linux:

ユーザーの自宅ディレクトリ:/ root

ユーザー名:root

モジュールや拡張機能をインストールする必要はありません。

15
user966588

他の答えに基づいて、pwdgetpassの組み合わせのアプローチ

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()
11

UNIXでは、少なくともこれでうまくいきます。

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

編集: 私はちょうどそれを調べた、これはWindowsとUNIX上で動作します:

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

UNIXではユーザー名を返しますが、Windowsではユーザーのグループ、スラッシュ、ユーザー名を返します。

-

I.E.

UNIXが返します。 "username"

Windowsが返します: "domain/username"

-

おもしろいですが、とにかく端末で何かをしているのでなければ理想的ではありません…その場合はまず最初にos.systemを使用します。たとえば、少し前に私は自分のユーザーをグループに追加する必要がありましたので、私はそうしました(これはLinuxにあります。

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やgetpassをインポートする必要はありません。

Windowsの特定のアプリケーションでは、 "domain/user"があると便利だとも思います。

8
dylnmc

私はUnixやWindowsで移植性のある方法でユーザー名を取得するために、しばらく前にplxモジュールを書きました: http://www.decalage.info/en/python/plx

使用法:

import plx

username = plx.get_username()

(Windowsではwin32拡張が必要です)

5
decalage

Windows APIを使用すると、Windows上で現在のユーザー名を取得できますが、ctypes FFI( GetCurrentProcessOpenProcessTokenGetTokenInformation )で呼び出すのは少し面倒です。 → LookupAccountSid )。

私はPythonから直接これを実行できる小さなモジュール、 getuser.py を書きました。使用法:

import getuser
print(getuser.lookup_username())

これはWindowsと* nixの両方で動作します(後者は他の答えで説明されているようにpwdモジュールを使用します)。

3
Michael Kropat

標準のpythonライブラリだけを使う:

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

WindowsまたはLinuxで動作します

別の方法として、即時呼び出しで1行を削除することもできます。

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