0

Here is a list of steps to reproduce this problem:

chaudhary@recsys $ ipython3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: !pwd
/tmp/test

In [2]: !ls -ltr /tmp | grep test
drwxrwxr-x 2 chaudhary recsys     4096 Jul 20 12:01 test

In [3]: import os

In [4]: os.makedirs('foo/bar/baz', mode=0o775)

In [5]: !tree -pugh
.
└── [drwxr-xr-x chaudhary recsys   4.0K]  foo
    └── [drwxr-xr-x chaudhary recsys   4.0K]  bar
        └── [drwxr-xr-x chaudhary recsys   4.0K]  baz

3 directories, 0 files

Ideally, all these folders should have group write permission drwxrwxr-x. I know that I can work around this as mentioned in this question's answer.

I would like to know if there is something I'm missing that might be the reason why group permission is wrong.

UPDATE:

Test snippet shown above was done on Linux (Ubuntu 16.04). I was able to reproduce this in Mac also.

chaudhary@MacBookProoo $ mkdir /tmp/test; chmod 775 /tmp/test; ls -l /tmp/ | grep test; cd /tmp/test; python3 -c 'import os; os.makedirs("foo/bar/baz", 0o775)'; ls -l /tmp/test; ls -l /tmp/test/foo; ls -l /tmp/test/foo/bar

drwxrwxr-x 2 chaudhary wheel      68 Jul 20 12:22 test
total 0
drwxr-xr-x 3 chaudhary wheel 102 Jul 20 12:22 foo
total 0
drwxr-xr-x 3 chaudhary wheel 102 Jul 20 12:22 bar
total 0
drwxr-xr-x 2 chaudhary wheel 68 Jul 20 12:22 baz
Shubham Chaudhary
  • 47,722
  • 9
  • 78
  • 80

2 Answers2

1

In the doc it says in some systems the mode parameter is ignored or not well interpreted:

On some systems, mode is ignored. Where it is used, the current umask value is first masked out. If bits other than the last 9 (i.e. the last 3 digits of the octal representation of the mode) are set, their meaning is platform-dependent. On some platforms, they are ignored and you should call chmod() explicitly to set them.

And it suggest you to use chmod() instead

Source https://docs.python.org/3/library/os.html#os.mkdir

lapinkoira
  • 8,320
  • 9
  • 51
  • 94
1

Python honors umask and sometimes ignores the mode entirely:

On some systems, mode is ignored. Where it is used, the current umask value is first masked out. If bits other than the last 9 (i.e. the last 3 digits of the octal representation of the mode) are set, their meaning is platform-dependent. On some platforms, they are ignored and you should call chmod() explicitly to set them.

from: https://docs.python.org/3/library/os.html

More about umask here

So one way to go is to set the umask not to interfere with your desired permissions (for your running process - also be sure to reset them afterward):

demo@demo:~/demo$ mkdir demo0
demo@demo:~/demo$ cat test.py
import os

os.makedirs("demo1/demo2/demo3",0775)

demo@demo:~/demo$ python test.py
demo@demo:~/demo$ ls -lah
total 24K
drwxr-xr-x 4 demo demo 4.0K Jul 20 06:52 .
drwxr-xr-x 6 demo demo 4.0K Jul 20 06:52 ..
drwxr-xr-x 2 demo demo 4.0K Jul 20 06:52 demo0
drwxr-xr-x 3 demo demo 4.0K Jul 20 06:52 demo1
-rw-r--r-- 1 demo demo  118 Jul 20 06:52 test2.py
-rw-r--r-- 1 demo demo   50 Jul 20 06:46 test.py
demo@demo:~/demo$ cat test2.py
import os

try:
    oldumask = os.umask(0)
    os.makedirs("demo2/demo3/demo4",0775)
finally:
    os.umask(oldumask)

demo@demo:~/demo$ python test2.py
demo@demo:~/demo$ ls -lah
total 28K
drwxr-xr-x 5 demo demo 4.0K Jul 20 06:52 .
drwxr-xr-x 6 demo demo 4.0K Jul 20 06:52 ..
drwxr-xr-x 2 demo demo 4.0K Jul 20 06:52 demo0
drwxr-xr-x 3 demo demo 4.0K Jul 20 06:52 demo1
drwxrwxr-x 3 demo demo 4.0K Jul 20 06:52 demo2
-rw-r--r-- 1 demo demo  118 Jul 20 06:52 test2.py
-rw-r--r-- 1 demo demo   50 Jul 20 06:46 test.py
demo@demo:~/demo$ ls -lah demo2/
total 12K
drwxrwxr-x 3 demo demo 4.0K Jul 20 06:52 .
drwxr-xr-x 5 demo demo 4.0K Jul 20 06:52 ..
drwxrwxr-x 3 demo demo 4.0K Jul 20 06:52 demo3
demo@demo:~/demo$

Of course, if you need those permissions all the time, you can set the umask on os-level.

Shubham Chaudhary
  • 47,722
  • 9
  • 78
  • 80
Mandraenke
  • 3,086
  • 1
  • 13
  • 26