0

我通过本地安装了自己的软件包。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
.....

我该如何解决?

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

4

1 回答 1

3

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

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

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

您的问题的解决方案是首先卸载模块(您可以简单地以根用户身份删除整个树)。

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

  1. 您的包未安装在全局 Python 包存储库中。
  2. 您的包的文件归您的普通用户帐户所有。
  3. 无需使用提升的权限(如 sudo)即可正确执行任何文件级操作。

现在,如果您需要在包的设置过程中创建这些目录,那么您需要修改setup.py.

于 2015-03-29T05:38:42.480 回答