現在のユーザーのユーザー名をPythonで取得するための移植可能な方法はありますか(つまり、少なくともLinuxとWindowsの両方で動作するもの)。 os.getuid
のように動作します。
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
私は歩き回って、決定的な答えを見つけられなかったことに驚きました(おそらく私は単にグーグルをやっていなかっただけですが)。 pwd モジュールは、Linuxなどでこれを達成するための比較的簡単な方法を提供しますが、Windowsにはありません。一部の検索結果では、Windows環境でユーザー名を取得するのは、特定の状況(たとえば、Windowsサービスとして実行されている場合など)では複雑になる可能性があることを示唆しています。
getpass moduleを見てください。
import getpass
getpass.getuser()
'kostya'
出荷時期:Unix、ウィンドウズ
pS "この関数はさまざまな環境変数の値を調べてユーザー名を決定します。したがって、この関数はアクセス制御の目的(または他の目的のために使用される可能性があります。他の)。"
os.getuid()
とpwd.getpwuid()
を組み合わせることが最善の策です。
import os
import pwd
def get_username():
return pwd.getpwuid( os.getuid() )[ 0 ]
詳細についてはpwdのドキュメントを参照してください。
また使用することができます:
os.getlogin()
あなたはおそらく使用することができます:
os.environ.get('USERNAME')
または
os.environ.get('USER')
しかし、環境変数が変更される可能性があるため、安全ではありません。
これらはうまくいくかもしれません。サービスとして実行したときの動作がわかりません。移植性はありませんが、それが "os.name"と "if"ステートメントの目的です。
win32api.GetUserName()
win32api.GetUserNameEx(...)
参照してください: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
ユーザの自宅のディレクトリを取得するためにこれが必要な場合は、以下が標準ライブラリの一部である移植性(少なくともwin32とlinux)と見なされる可能性があります。
>>> os.path.expanduser('~')
'C:\\Documents and Settings\\johnsmith'
また、このような文字列を解析して最後のパスコンポーネント(つまりユーザー名)のみを取得することもできます。
参照してください: os.path.expanduser
私にとって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
モジュールや拡張機能をインストールする必要はありません。
他の答えに基づいて、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()
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"があると便利だとも思います。
私はUnixやWindowsで移植性のある方法でユーザー名を取得するために、しばらく前にplxモジュールを書きました: http://www.decalage.info/en/python/plx
使用法:
import plx
username = plx.get_username()
(Windowsではwin32拡張が必要です)
Windows APIを使用すると、Windows上で現在のユーザー名を取得できますが、ctypes FFI( GetCurrentProcess → OpenProcessToken → GetTokenInformation )で呼び出すのは少し面倒です。 → LookupAccountSid )。
私はPythonから直接これを実行できる小さなモジュール、 getuser.py を書きました。使用法:
import getuser
print(getuser.lookup_username())
これはWindowsと* nixの両方で動作します(後者は他の答えで説明されているようにpwd
モジュールを使用します)。
標準の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"])()