我在本地通过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代码也会在执行时抛出相同的异常。
答案 0 :(得分:2)
我在本地通过
sudo python setup.py install
安装了自己的软件包。
使用sudo
(您不应该这样做)之后,您的软件包包含的所有文件都归root所有,因为它的root用户正在运行setup.py install
。
现在,当您尝试以普通用户身份运行包中包含的任何模块,并且该模块尝试打开/修改/读取/创建属于包本身的任何目录或文件时,它将运行进入许可问题。您的软件包的所有文件都归root所有,并且您尝试使用普通用户运行它,并且该用户无法在软件包的源路径中创建目录(此处引用os.path.dirname(os.path.realpath(__file__))
。
问题的解决方案是首先卸载模块(您只需以root身份删除整个树)。
接下来,作为普通用户,创建一个虚拟环境并安装您的软件包。这将确保:
现在,如果您需要在程序包的设置过程中创建这些目录,则需要修改setup.py
。