Czy istnieje przenośny sposób na uzyskanie nazwy użytkownika bieżącego użytkownika w Pythonie (tj. Takiej, która działa przynajmniej pod Linuksem i Windows). Działa to tak os.getuid
:
>>> os.getuid()
42
>>> os.getusername()
'slartibartfast'
Gogłem w kółko i byłem zaskoczony, że nie znalazłem ostatecznej odpowiedzi (chociaż być może po prostu źle googlowałem). Pwd Moduł zapewnia stosunkowo łatwy sposób, aby osiągnąć to pod, powiedzmy, Linux, ale nie jest obecny w systemie Windows. Niektóre wyniki wyszukiwania sugerowały, że uzyskanie nazwy użytkownika w systemie Windows może być skomplikowane w pewnych okolicznościach (np. Działanie jako usługa systemu Windows), chociaż tego nie zweryfikowałem.
python
portability
username
Jacob Gabrielson
źródło
źródło
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecos
lubimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
Odpowiedzi:
Spójrz na moduł getpass
Dostępność: Unix, Windows
ps W komentarzu poniżej ” ta funkcja sprawdza wartości różnych zmiennych środowiskowych w celu ustalenia nazwy użytkownika. Dlatego nie należy polegać na tej funkcji do celów kontroli dostępu (lub ewentualnie w jakimkolwiek innym celu, ponieważ pozwala każdemu użytkownikowi na podszywanie się pod inne osoby) ). ”
źródło
Najlepiej byłoby połączyć
os.getuid()
zpwd.getpwuid()
:Więcej informacji można znaleźć w dokumentach pwd:
http://docs.python.org/library/pwd.html
źródło
pwd.getpwuid(os.getuid()).pw_name
.ImportError: No module named pwd
sudo
poprawnie obsługuje skrzynkę. (Wiem, że OP nie zrobił; nie prosiłem o uniksopodobneMożesz także użyć:
źródło
Prawdopodobnie możesz użyć:
lub
Ale to nie będzie bezpieczne, ponieważ zmienne środowiskowe można zmieniać.
źródło
os.getenv(...)
jest przestarzałe na korzyśćos.environ[...]
.os.getenv
nie wydaje się być przestarzały ..?Te mogą działać. Nie wiem, jak się zachowują, gdy działają jako usługa. Nie są przenośne, ale do tego właśnie służą
os.name
iif
stwierdzenia.Zobacz: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html
źródło
SET USERNAME=FAKE
przed poleceniem w PythonieJeśli potrzebujesz tego, aby uzyskać katalog domowy użytkownika, poniżej można go uznać za przenośny (przynajmniej Win32 i Linux), będący częścią standardowej biblioteki.
Można również przeanalizować taki ciąg, aby uzyskać tylko ostatni składnik ścieżki (tj. Nazwę użytkownika).
Zobacz: os.path.expanduser
źródło
Dla mnie użycie
os
modułu wygląda najlepiej pod względem przenośności: Działa najlepiej zarówno w systemie Linux, jak i Windows.Wynik:
Windows:
Linux:
Nie ma potrzeby instalowania żadnych modułów ani rozszerzeń.
źródło
Połączone
pwd
igetpass
podejście oparte na innych odpowiedziach:źródło
Przynajmniej w przypadku systemu UNIX działa to ...
edycja: Właśnie to sprawdziłem i działa to w systemach Windows i UNIX:
W systemie UNIX zwraca nazwę użytkownika, ale w systemie Windows zwraca grupę użytkownika, ukośnik, nazwę użytkownika.
-
TO ZNACZY
Zwraca UNIX: „nazwa użytkownika”
System Windows zwraca: „domena / nazwa użytkownika”
-
Jest to interesujące, ale prawdopodobnie nie idealne, chyba że i tak robisz coś w terminalu ... w takim przypadku prawdopodobnie używałbyś
os.system
na początku. Na przykład jakiś czas temu musiałem dodać mojego użytkownika do grupy, więc zrobiłem to (jest to w Linuksie, pamiętajcie)Wydaje mi się, że jest to łatwiejsze do odczytania i nie trzeba importować pwd ani getpass.
Mam też wrażenie, że „domena / użytkownik” może być pomocna w niektórych aplikacjach w systemie Windows.
źródło
domain/user
group/user
user = subprocess.check_output("whoami").replace("\r\n", "")
chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid
nie mam nikogo . po drugie,user = subprocess.check_output("whoami").strip()
jest bardziej przenośny niż wymienione zastępcze źródła linii.commands
vssubprocess
wydaje się dziwaczne, ale brakuje poleceń w Pythonie 3.Napisałem moduł plx jakiś czas temu, aby uzyskać nazwę użytkownika w przenośny sposób w systemach Unix i Windows (między innymi): http://www.decalage.info/en/python/plx
Stosowanie:
(wymaga rozszerzeń win32 w systemie Windows)
źródło
Używając tylko standardowych bibliotek Pythona:
Działa w systemie Windows, Mac lub Linux
Alternatywnie możesz usunąć jedną linię za pomocą natychmiastowego wywołania:
źródło
Możesz uzyskać bieżącą nazwę użytkownika w systemie Windows, przechodząc przez interfejs API systemu Windows, chociaż wywoływanie za pomocą FFI ctyp jest nieco kłopotliwe ( GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid ).
Napisałem mały moduł, który może to zrobić prosto z Pythona, getuser.py . Stosowanie:
Działa zarówno w systemie Windows, jak i * nix (ten ostatni używa
pwd
modułu zgodnie z opisem w innych odpowiedziach).źródło