Widzę, że jeśli zmienimy zmienną środowiskową HOME (linux) lub USERPROFILE (windows) i uruchomimy skrypt w języku Python, zwróci on nową wartość jako użytkownik domowy, gdy próbowałem, os.environ ['HOME'] os.exp
Czy istnieje sposób, aby znaleźć katalog osobisty rzeczywistego użytkownika bez polegania na zmiennej środowiskowej?
edit:
Oto sposób na znalezienie userhome w systemie Windows, czytając w rejestrze, http://mail.python.org/pipermail/python-win32/2008-J January/006677.html
edycja:
jeden ze sposobów znajdowania domu systemu Windows za pomocą pywin32,
from win32com.shell import shell,shellcon
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)
~user
Przenosi cię do katalogu domowego bieżącego użytkownika. W oknach nie mam pojęcia.Odpowiedzi:
Myślę, że
os.path.expanduser(path)
mogłoby być pomocne.Możesz więc po prostu zrobić:
os.path.expanduser('~user')
źródło
'~user'
który powinien działać na Linuksie i Windowsie (tutaj nie jestem pewien w 100%, ponieważ nie mam Windowsa do testowania;)).Myślę, że
os.path.expanduser(path)
to najlepsza odpowiedź na twoje pytanie, ale istnieje alternatywa, o której warto wspomnieć w świecie Uniksa:pwd
pakiet. na przykładimport os, pwd pwd.getpwuid(os.getuid()).pw_dir
źródło
from pathlib import * str(Path.home())
działa w Pythonie 3.5 i nowszych.
Path.home()
zwracaPath
obiekt udostępniający API, które uważam za bardzo przydatne.źródło
pathlib
nadal opiera się na zmiennych środowiskowych, więc nie odpowiada to na twoje konkretne pytanie. Ponieważ wszystkie pytania bardziej ogólne zostały oznaczone jako duplikaty i odnoszą się do nich tutaj, może to być najlepsze miejsce na tę odpowiedź.home_folder = os.getenv('HOME')
Powinno to działać również w systemie Windows i Mac OS, działa dobrze w systemie Linux.
źródło
Dla Windowsa;
import os homepath = os.path.expanduser(os.getenv('USERPROFILE'))
da ci uchwyt do katalogu domowego bieżącego użytkownika i
filepath = os.path.expanduser(os.getenv('USERPROFILE'))+'\\Documents\\myfile.txt'
da ci uchwyt do poniższego pliku;
źródło
W rzeczywistości zmiana zmiennej środowiskowej wskazuje, że dom musi zostać zmieniony. Więc każdy program / skrypt powinien mieć nowy dom w kontekście; również konsekwencje zależą od osoby, która to zmieniła. Nadal bym się trzymał
home = os.getenv('USERPROFILE') or os.getenv('HOME')
co dokładnie jest wymagane?
źródło
Zdaję sobie sprawę, że to stare pytanie, na które udzielono odpowiedzi, ale pomyślałem, że dodam swoje dwa centy. Przyjęta odpowiedź nie działała dla mnie. Musiałem znaleźć katalog użytkownika i chciałem, aby działał zi bez
sudo
. W Linuksie mój katalog użytkownika to „/ home / someuser”, ale mój katalog główny to „/ root /”. Jednak na moim Macu katalog użytkownika to „/ Users / someuser”. Oto, co ostatecznie zrobiłem:_USERNAME = os.getenv("SUDO_USER") or os.getenv("USER") _HOME = os.path.expanduser('~'+_USERNAME)
Działało to zarówno z, jak i bez
sudo
na komputerach Mac i Linux.źródło
_USERNAME
byłoNone
. Dla przyszłych czytelników.or ""
?W systemie Linux i innych UNIXoidach zawsze możesz zajrzeć
/etc/passwd
. Katalog domowy to szóste pole rozdzielone dwukropkami. Nie mam jednak pojęcia, jak to zrobić lepiej niż zmienna środowiskowa w systemie Windows. Pojawi się wywołanie systemowe, ale jeśli jest dostępne z Pythona, ...źródło
pobierz (przetłumaczone) nazwy folderów użytkowników w systemie Linux:
from gi.repository import GLib docs = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOCUMENTS) desktop = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DESKTOP) pics = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PICTURES) videos = GLib.get_user_special_dir(GLib.USER_DIRECTORY_VIDEOS) music = GLib.get_user_special_dir(GLib.USER_DIRECTORY_MUSIC) downloads = GLib.get_user_special_dir(GLib.USER_DIRECTORY_DOWNLOAD) public = GLib.get_user_special_dir(GLib.USER_DIRECTORY_PUBLIC_SHARE) templates = GLib.get_user_special_dir(GLib.USER_DIRECTORY_TEMPLATES) print(docs) print(desktop) print(pics) print(videos) print(music) print(downloads) print(public) print(templates)
źródło