Pythonを使用して実際のユーザーのホームディレクトリを見つける方法は?


81

HOME(linux)またはUSERPROFILE(windows)環境変数を変更してPythonスクリプトを実行すると、試したときにユーザーホームとして新しい値が返されることがわかります。os.environ['HOME'] os.exp

環境変数に依存せずに実際のユーザーのホームディレクトリを見つける方法はありますか?

編集:
レジストリ、http: //mail.python.org/pipermail/python-win32/2008-January/006677.htmlを読んで、Windowsでユーザーホームを見つける方法は次のとおりです

編集:
pywin32を使用してWindowsホームを見つける1つの方法、

from win32com.shell import shell,shellcon
home = shell.SHGetFolderPath(0, shellcon.CSIDL_PROFILE, None, 0)

UNIXコマンド(ショートカット)をチェックアウトする~userことをお勧めします。現在のユーザーのホームディレクトリに移動します。Windowsではわかりません。
mAm 2010

これは、Pythonでホームディレクトリを取得する方法の複製としてマークする必要がありますか?その質問の受け入れられた答えはPython3で機能しますが、この質問は機能しないためです。
Dour HighArch20年

回答:


96

os.path.expanduser(path)役に立つと思います。

UnixおよびWindowsでは、そのユーザーのホームディレクトリの初期コンポーネント~ または~userそのホームディレクトリに置き換えられた引数を返します。

Unixでは、イニシャル~が設定されている場合、環境変数HOMEに置き換えられます。それ以外の場合、現在のユーザーのホームディレクトリは、組み込みモジュールを介してパスワードディレクトリで検索されますpwdイニシャル~userは、パスワードディレクトリで直接検索されます

Windowsでは、設定されている場合はHOMEとUSERPROFILEが使用され、設定されていない場合はHOMEPATHとHOMEDRIVEの組み合わせが使用されます。イニシャル~userは、上記で導出された作成済みユーザーパスから最後のディレクトリコンポーネントを削除することによって処理されます

拡張が失敗した場合、またはパスがチルダで始まらない場合、パスは変更されずに返されます。

だからあなたはただすることができます:

os.path.expanduser('~user')

3
本当ですが、質問のように環境変数を変更すると、このメソッドも「だまされ」ます。さて、なぜそれをしたいのか、私には言えません。:)
Jakob Borg

1
@calmh:はい、'~user'LinuxとWindowsで動作するように変更しました(ここでは、テストするWindowsがないため、100%確信が持てません;))。
Felix Kling 2010

1
これはLinuxでは機能しますが、Windowsでは機能しません。Windowsでは、渡されたユーザー名に「C:\ Documentsandsettings」を結合するだけです。
asdfg 2010

これは、「HOME」変数が間違っているという問題を解決しません。参照cadence.com/Community/forums/t/17969.aspx例えば
endolith

1
@asdfg:正しく機能したように思えます。しかし、最初は「〜」(追加する)ではなく、リテラル文字列「〜user」(実際には「〜Bob」などのリテラルである必要があります)を渡していたため、最初に試したときに失敗したと思いました。現在のユーザー)。
Jon Coombs 2014年

17

os.path.expanduser(path)はあなたの質問に対する最良の答えだと思いますが、Unixの世界で言及する価値のある代替案がありpwdます。それはパッケージです。例えば

import os, pwd

pwd.getpwuid(os.getuid()).pw_dir

1
これは、ユーザーのホームディレクトリが必要であるが、HOME環境変数が正しく設定されていない場合に役立ちます。著者が指摘したように、これはプラットフォームに依存しませんが、WindowsではなくUNIX用です。
user1071847 2016年

1
これは、sudo呼び出し間で保持される場合とされない場合があるHOME環境変数に依存するよりも優れています。たとえば、HOMEenv。変数はDebian8ではターゲットのユーザーに設定されます(「sudo」は「sudo-H」として機能します)が、Ubuntu 16では保持されます(「sudo」は「sudo
Andrei Korostelev 2017年

17
from pathlib import *

str(Path.home())

Python3.5以降で動作します。非常に便利なAPIを提供するオブジェクトをPath.home()返します。Path


1
内部的には、pathlib依然として環境変数に依存しているため、これは特定の質問に答えることはできません。より一般的な質問はすべて重複としてマークされ、ここを参照しているため、これがこの回答に最適な場所である可能性があります。
Julius Kunze 2017年

pathlibは、パス処理のためのライブラリに移動します。.home()について知りませんでした。すべての良さを確認するには、ドキュメントをもう一度確認する必要があります。乾杯!
PlacidLush

5

home_folder = os.getenv('HOME')

これはWindowsとMacOSでも機能するはずで、Linuxでもうまく機能します。


1
少なくとも、これは名前HOMEPATHありwin10だってvarible上で動作していない
Reishin

@Reishinは完全に真実ではありません。テストしたところ、Windows 10Proで動作します。その名前で環境変数を見つけることを期待しているソフトウェアの量を考えると、気まぐれで環境変数の名前を変更する余裕はないと思います。
sm 2017年

@smここでtechnet.microsoft.com/en-us/library/cc749104(v=ws.10).aspx"HOME "変数を見つけてみてください。カスタム変数がある場合、それはすべてのpplがそれを持っていることを意味するわけではありません。最も一般的なのは、mingw、cygwin、gitshellなどです...設定します。しかし、cmd.exeを実行すると、驚くでしょう
Reishin 2017年

4

Windowsの場合;

import os
homepath = os.path.expanduser(os.getenv('USERPROFILE'))

現在のユーザーのホームディレクトリへのハンドルを提供し、

filepath = os.path.expanduser(os.getenv('USERPROFILE'))+'\\Documents\\myfile.txt'

以下のファイルへのハンドルを提供します。

C:\Users\urUserName\Documents\myfile.txt

3

実際、環境変数の変更は、家を変更する必要があることを示しています。したがって、すべてのプログラム/スクリプトには、コンテキスト内の新しいホームが必要です。また、結果はそれを変更した人次第です。私はまだ固執します home = os.getenv('USERPROFILE') or os.getenv('HOME')

正確には何が必要ですか?


5
Cygwinを除いて、その場合、通常は両方が定義され、多くの場合異なります。
amphetamachine

3

これは答えられた古い質問だと思いますが、2セント追加すると思いました。受け入れられた答えは私のために働いていませんでした。ユーザーディレクトリを見つける必要があり、それを使用してもしなくても機能するようにしたかったのsudoです。Linuxでは、ユーザーディレクトリは「/ home / someuser」ですが、ルートディレクトリは「/ root /」です。ただし、私のMacでは、ユーザーディレクトリは「/ Users / someuser」です。これが私がやったことです:

_USERNAME = os.getenv("SUDO_USER") or os.getenv("USER") 
_HOME = os.path.expanduser('~'+_USERNAME)

これは、sudoMacとLinuxの有無にかかわらず機能しました。


私が知っているあなたは、MacとLinuxは言ったが、Windows上_USERNAMEでしたNone。将来の読者のために。
Thomas Fauskanger 2017

pathlibからimportPath; Path.home()。as_posix()#Windowsでも機能します。本質的にはSpronckの方法と同じですが、もっと自然かもしれません。
マイキー

それをWindowsで動作させることは追加することであるということは改善or ""でしょうか?
PascalVKooten

0

Linuxやその他のUNIXoidでは、いつでもを覗くことができます/etc/passwd。ホームディレクトリは、そこにある6番目のコロンで区切られたフィールドです。ただし、Windowsの環境変数よりも優れた方法はわかりません。システムコールがありますが、Pythonから入手できる場合は...


1
しかし、それはUnix(Linux)だけでしょうね。
リングベアラー

1
@ ring-うん。その効果にテキストを追加しました。
Jakob Borg

-1

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)

どのように翻訳しましたか?
ヘリット

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