24 March 2014

(Python, PHP) webとコマンドライン双方で通用するユーザのホームディレクトリを得る方法

・Perlの場合は → 『 (Perl) webとコマンドライン双方で通用するユーザのホームディレクトリを得る方法

Pythonでユーザのホームディレクトリ (例:/home/user )を得る方法は…

シェル内でPythonスクリプトが実行される場合は、次の方法のように環境変数を次のように読み取ればよい。

os.environ['HOME']
または
os.getenv('HOME')

だが、これはWeb上から呼ばれるスクリプトの場合は環境変数を読み取る方法は通用しない。コマンドライン、Web上双方で通用する方法は

pwd.getpwuid(os.getuid())[5]
または
os.path.expanduser("~")

となる。でもって、ホームディレクトリを取得するサブルーチンを次のように書いてみる

# -*- coding: utf-8 -*-
 
import os
import pwd
 
def func_get_homedir():
    if 'HOME' in os.environ:
        return os.environ['HOME'];
    else:
        return pwd.getpwuid(os.getuid())[5];
 
print "func_get_homedirで得られる値 = " + func_get_homedir()

なお、スクリプト先頭でユーザディレクトリ下にインストールされたライブラリを読み込まなければならないとき、次のようにして検索パスを追加することになる。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import os
import sys
 
sys.path.append(os.path.expanduser("~") + '/lib/python')
import ....

pwd.getpwuid(os.getuid())で得られる値の一覧を試しに出してみると

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import os
import pwd
 
# ユーザーディレクトリ (Webスクリプト上で使用可)
print "pwd.getpwuid(os.getuid())[5] = " +  pwd.getpwuid(os.getuid())[5]
print "os.path.expanduser(\"~\") = " + os.path.expanduser("~")
 
# 全てのリスト項目を列挙してみる
print "list all pwd.getpwuid ..."
for i in range(0, len(pwd.getpwuid(os.getuid()))):
    print "  pwd.getpwuid(os.getuid())[%d] = %s" % (i, pwd.getpwuid(os.getuid())[i])
 
# ユーザーディレクトリ (シェル実行の時のみ)
print "os.environ['HOME'] = " + os.environ['HOME']
print "os.getenv('HOME') = " + os.getenv('HOME')

実行結果は

pwd.getpwuid(os.getuid())[5] = /home/user
os.path.expanduser("~") = /home/user
list all pwd.getpwuid ...
  pwd.getpwuid(os.getuid())[0] = user
  pwd.getpwuid(os.getuid())[1] = x
  pwd.getpwuid(os.getuid())[2] = 1001
  pwd.getpwuid(os.getuid())[3] = 1001
  pwd.getpwuid(os.getuid())[4] = user,,,
  pwd.getpwuid(os.getuid())[5] = /home/user
  pwd.getpwuid(os.getuid())[6] = /bin/bash
os.environ['HOME'] = /home/user
os.getenv('HOME') = /home/user

PHPでユーザのホームディレクトリ (例:/home/user )を得る方法は…

シェル内でPHPスクリプトを実行する場合、次の方法で環境変数を読み取ってもよい。

getenv('HOME');

Webでもシェル内でも使える方法は

$info=posix_getpwuid(posix_geteuid());
print $info['dir'];

となる。$infoに入っている値を列挙してみると…

<?php
 
$info=posix_getpwuid(posix_geteuid());      // get user HOME dir
print_r($info);

実行結果は

Array
(
    [name] => user
    [passwd] => x
    [uid] => 1001
    [gid] => 1001
    [gecos] => user,,,
    [dir] => /home/user
    [shell] => /bin/bash
)

となる。