os.chown is exactly what I want, but I want to specify the user and group by name, not ID (I don't know what they are). How can I do that?
            Asked
            
        
        
            Active
            
        
            Viewed 7.3k times
        
    68
            
            
        - 
                    possible duplicate of [Python: finding uid/gid for a given username/groupname (for os.chown)](http://stackoverflow.com/questions/826082/python-finding-uid-gid-for-a-given-username-groupname-for-os-chown) – Louis Apr 16 '15 at 18:08
4 Answers
124
            import pwd
import grp
import os
uid = pwd.getpwnam("nobody").pw_uid
gid = grp.getgrnam("nogroup").gr_gid
path = '/tmp/f.txt'
os.chown(path, uid, gid)
 
    
    
        Diego Torres Milano
        
- 65,697
- 9
- 111
- 134
- 
                    
- 
                    1Yes, just pass -1 for the ID you want to ignore as per the documentation (https://docs.python.org/3/library/os.html#os.chown) – josh2112 Aug 31 '21 at 20:15
57
            
            
        Since Python 3.3 https://docs.python.org/3.3/library/shutil.html#shutil.chown
import shutil
shutil.chown(path, user=None, group=None)
Change owner user and/or group of the given path.
user can be a system user name or a uid; the same applies to group.
At least one argument is required.
Availability: Unix.
 
    
    
        Oleg Neumyvakin
        
- 9,706
- 3
- 58
- 62
5
            
            
        Since the shutil version supports group being optional, I copy and pasted the code to my Python2 project.
https://hg.python.org/cpython/file/tip/Lib/shutil.py#l1010
def chown(path, user=None, group=None):
    """Change owner user and group of the given path.
    user and group can be the uid/gid or the user/group names, and in that case,
    they are converted to their respective uid/gid.
    """
    if user is None and group is None:
        raise ValueError("user and/or group must be set")
    _user = user
    _group = group
    # -1 means don't change it
    if user is None:
        _user = -1
    # user can either be an int (the uid) or a string (the system username)
    elif isinstance(user, basestring):
        _user = _get_uid(user)
        if _user is None:
            raise LookupError("no such user: {!r}".format(user))
    if group is None:
        _group = -1
    elif not isinstance(group, int):
        _group = _get_gid(group)
        if _group is None:
            raise LookupError("no such group: {!r}".format(group))
    os.chown(path, _user, _group)
 
    
    
        guettli
        
- 25,042
- 81
- 346
- 663
-3
            
            
        You can use id -u wong2 to get the uid of a user
You can do this with python:  
import os 
def getUidByUname(uname):
    return os.popen("id -u %s" % uname).read().strip()
Then use the id to os.chown
 
    
    
        wong2
        
- 34,358
- 48
- 134
- 179
