Pythonで現在のユーザー名を取得するポータブルな方法はありますか?


598

現在のユーザーのユーザー名をPythonで取得するポータブルな方法はありますか(つまり、少なくともLinuxとWindowsの両方で機能する方法)。それは次のように機能しos.getuidます:

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

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


Linuxボックスでは動作しません!
リカルド

5
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosまたはimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
2015年

getusername()はos Pythonモジュールでは無効なメソッドです: docs.python.org/2.7/library/os.html
Matt Bruzek

17
@MattBruzekそれがOPのポイントでした。彼は、そのような関数が存在する場合、それがどのように呼び出されるかを想像していました。
突く

回答:


836

getpassモジュールを見てください

import getpass
getpass.getuser()
'kostya'

可用性:Unix、Windows


下記のコメントごとのps " この関数は、さまざまな環境変数の値を調べてユーザー名を決定します。したがって、この関数は、ユーザーが他のユーザーになりすますことを許可するため、アクセス制御の目的(またはおそらく他の目的)に依存しないでください。 )。 "


100
この関数は、さまざまな環境変数の値を調べてユーザー名を決定しているようです。したがって、この機能は、アクセス制御の目的(またはユーザーが他のユーザーになりすますことを許可するため、おそらく他の目的)に依存すべきではありません。
グレッグヒューギル

25
はユーザーを認証すると主張していないため、getpass.getuser()に問題はありません。この関数の目的は、ユーザーに直接尋ねることなく、ユーザーがだれであると主張しているのかを判別することです。
Walker Hale IV、

7
suを実行した場合は機能しません。$ echo $ USER hithwen $ su juliaパスワード:$ echo $ USER julia $ python >>> import getpass >>> getpass.getuser() 'hithwen'
hithwen

6
@GregHewgillは非常に良い点を提起しますが、確かに、これはいくつかのアプリケーションを持っているような単純な未認証の方法でユーザー名を見つけることです。私の現在の使用例:後で簡単にクリーンアップできるように、いくつかの共有テストリソースにユーザー名をタグ付けします。(したがって、
だれがだれ

16
そして、私はアクセス制御の目的で@GregHewgillに同意しますが、「他の目的」には完全に同意しません。これは、「シェルスクリプトで$ USERを使用しないでください」と言っているようなものです。アクセス制御についての重要なポイントですが、authを使用しない他の多くの用途があります。
nevelis 14

119

あなたは最善の策は、組み合わせることであろうos.getuid()pwd.getpwuid()

import os
import pwd

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

詳細については、pwd docsを参照してください。

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


51
代わりに(わずかに良く読み取るために): pwd.getpwuid(os.getuid()).pw_name
ブライアンM.ハント

6
Windowsでは何をしますか?おそらくこれを試すことができ、失敗した場合は、くだらない 'getpass / env var'メソッドにフォールバックします。
Jonathan Hartley

2
あなたとし、ログインせずに、両方のユーザー名を取得する必要がある場合、これは正しい方法です。
デリック・チャン

5
@JonathanHartley:ImportError: No module named pwd
Justin

1
この方法はケースを正しく処理するため、コンスタンチンテンジンの回答よりもはるかに優れたUNIXライクなシステムで使用できますsudo。(私は、OPがunixのようなシステムを要求していないことを知っています。)
Halloleo '10

86

次のものも使用できます。

 os.getlogin()

29
Linuxでは、getlogin()は「プロセスの制御端末にログインしているユーザー」の名前を返します。したがって、mod_pythonアプリケーションなど、制御端末がない場合は失敗します。
Vebjorn Ljosa、

23
Windowsでは利用できません
Walker Hale IV、

3
suを使用した場合、現在のユーザーは返されませんが、最初にログインしたユーザーが返されます。
Trevor Allred 2014

4
Windowsで動作します... Python 3.4.1(v3.4.1:c0e311e010fc、2014年5月18日、10:38:22)[MSC v.1600 32ビット(Intel)] on win32タイプ "help"、 "copyright"、詳細については、「クレジット」または「ライセンス」。>>> osをインポート; os.getlogin() 'JRB'
Naib

5
Python 3.xのWindowsでのみ使用できます。
Zitrax

71

あなたはおそらく使用できます:

os.environ.get('USERNAME')

または

os.environ.get('USER')

しかし、環境変数は変更できるため、安全ではありません。


18
os.getenv(...)の代わりに非推奨ですos.environ[...]
マイクグラハム

11
USERNAMEではなくUSERであるべきではありませんか?
Karl Bartel 2012

7
@MikeGraham os.getenvは廃止予定ではないようです。
dbr

4
はい、正確にUSERとUSERNAMEは移植性がないため、正確な答えは得られません。
Peter M

2
USERNAMEはWindows用、USERはLinux用
サブリナ

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投票のunixのみの回答と同じくらい役に立ちます。
トムB

3
>「少なくとも同じくらい有用」同意する。おそらく正しい答えは、2つの組み合わせです。
Jonathan Hartley、

Windowsのpython 2で行き詰まっている場合、これが唯一の安全な方法です。他のすべての方法はSET USERNAME=FAKE、pythonコマンドの前に実行することでだまされる可能性があります
CodeKid

21

ユーザーのホームディレクトリを取得するためにこれが必要な場合、以下は標準ライブラリの一部であるポータブル(少なくともwin32およびlinux)と見なすことができます。

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

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

参照:os.path.expanduser


9
誰かのホームディレクトリは、常にユーザー名を反映しているとは限りません。
dreamlax

これはLinuxとWindowsの両方で機能します
Sabrina

残念ながら、WindowsでHOME変数を設定すると、その値が返されます。
GLRoman

15

私にとって、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]           

出力:

ウィンドウズ:

ユーザーのホームディレクトリ:C:\ Users \ myuser

ユーザー名:myuser

Linux:

ユーザーのホームディレクトリ:/ root

ユーザー名:root

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


16
このソリューションは賢いですが、常に正しいとは限らないいくつかの仮定を行います。Linuxでは、ユーザー名をhomedirパスに表示する必要があるという制約はありません。たまたまそうなのですが、システム管理者はユーザーのホームディレクトリを好きなように設定できます。
Joe Holloway

HOME変数の設定はこれを無効にします。
GLRoman

11

他の回答に基づいた組み合わせ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()

9

UNIXの場合、少なくともこれは機能します...

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

編集: 私はそれを調べたところ、これはWindowsとUNIXで動作します:

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

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

-

IE

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の特定のアプリケーションで役立つ可能性があると感じています。


1
Windowsが返さdomain/user ないgroup/user
RealHowTo 2014年

4
コマンドモジュールはWindowsでは機能しません。これはUNIX固有のモジュールです(docs.python.org/2/library/commands.htmlを参照)。現在は非推奨となっており、代わりにサブプロセスが推奨されます。 user = subprocess.check_output("whoami").replace("\r\n", "")
ConnectedSystems 2016

k; 次にサブプロセスを使用します... jeez
dylnmc

2備考。commands.whoamiは、別のユーザー名で実行されているサービスのコンテキストでさえ、素晴らしい機能を果たしました。つまり chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid 私は誰もいませんでした。2つ目は、user = subprocess.check_output("whoami").strip() 上記の置換ラインフィードよりも移植性が高いことです。commandsvs subprocessはひどいようですが、Python 3からコマンドが欠落しています
JL Peyret

5

UnixとWindows(特に)で移植可能な方法でユーザー名を取得するために、plxモジュールを少し前に書きました:http : //www.decalage.info/en/python/plx

使用法:

import plx

username = plx.get_username()

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


4

標準のPythonライブラリのみを使用:

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

Windows、MacまたはLinuxで動作します

または、すぐに呼び出して1行を削除することもできます。

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

1
getpassも標準ライブラリです
jodag

win10、python3.7.4では動作しません。「USER」が環境変数で見つからないという不満は、私が推測します。とにかくgetpassがより良い選択だと思います。
リカ

3

ctypes FFI(GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid)を介して呼び出すのは少し面倒ですが、Windows APIを介してWindows上の現在のユーザー名を取得できます。

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

import getuser
print(getuser.lookup_username())

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.