mkdir的权限被拒绝

时间:2015-03-29 05:11:43

标签: python python-os

我在本地通过sudo python setup.py install安装了我自己的软件包。在源代码中有代码导致OSError: (13, 'Permission denied', '....')

curr_dir = os.path.dirname(os.path.realpath(__file__))
    if not os.path.exists(os.path.dirname(os.path.join(curr_dir, "dir1/log1.out"))):
        os.makedirs(os.path.dirname(os.path.join(curr_dir, "dir1/log1.out")))

curr_dir是:

/usr/local/lib/python2.7/site-packages/my_app-1.2.3-py2.7.egg/my_app

$ ls -al '/usr/local/lib/python2.7/site-packages/my_app-1.2.3-py2.7.egg/my_app'
total 696
drwxr-xr-x  35 root  admin   1190 Mar 29 12:00 .
drwxr-xr-x   4 root  admin    136 Mar 29 12:00 ..
-rw-r--r--   1 root  admin    108 Mar 29 12:00 __init__.py
-rw-r--r--   1 root  admin    202 Mar 29 12:00 __init__.pyc
-rw-r--r--   1 root  admin  11964 Mar 29 12:00 file1.py
-rw-r--r--   1 root  admin  12953 Mar 29 12:00 file1.pyc
-rw-r--r--   1 root  admin  13424 Mar 29 12:00 file2.py
-rw-r--r--   1 root  admin  15621 Mar 29 12:00 file2.pyc
.....

我该如何解决?

P.S。即使我通过mkdir和touch手动创建文件curr_dir, "dir1/log1.out,python代码也会在执行时抛出相同的异常。

1 个答案:

答案 0 :(得分:2)

  

我在本地通过sudo python setup.py install安装了自己的软件包。

使用sudo(您不应该这样做)之后,您的软件包包含的所有文件都归root所有,因为它的root用户正在运行setup.py install

现在,当您尝试以普通用户身份运行包中包含的任何模块,并且该模块尝试打开/修改/读取/创建属于包本身的任何目录或文件时,它将运行进入许可问题。您的软件包的所有文件都归root所有,并且您尝试使用普通用户运行它,并且该用户无法在软件包的源路径中创建目录(此处引用os.path.dirname(os.path.realpath(__file__))

问题的解决方案是首先卸载模块(您只需以root身份删除整个树)。

接下来,作为普通用户,创建一个虚拟环境并安装您的软件包。这将确保:

  1. 您的软件包未安装在全局Python软件包存储库中。
  2. 您的软件包的文件归您的普通用户帐户所有。
  3. 可以在不使用提升权限(如sudo)的情况下正确执行任何文件级操作。
  4. 现在,如果您需要在程序包的设置过程中创建这些目录,则需要修改setup.py