由于 Errno 1,无法使用“--always-copy”标志设置 virtualenv
Unable to setup virtualenv with '--always-copy' flag due to Errno 1
我正在尝试运行这个命令
$ virtualenv --always-copy venv
然后我得到了所有这些错误:
shutil.Error: [('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Drag.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Drag.so'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Ctl.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Ctl.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Ctl.so'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/imageop.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/imageop.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/imageop.so'"),
('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Scrap.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Scrap.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Scrap.so'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_testcapi.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_testcapi.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_testcapi.so'"),
('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/unicodedata.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/unicodedata.so', "[Errno 1] Operation not permitted: '/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/unicodedata.so'"),
我检查了源文件的权限。都是可读的
$ ls -l '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so'
-rwxr-xr-x 1 root wheel 55936 3 Oct 16:50 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so
我一直确保 venv 在 运行 命令之前不存在。
那么为什么会失败?
版本信息:
$ python --version
Python 2.7.10
$ pip --version
pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
virtualenv使用shutil.copytree
拷贝文件,copytree
会用copystat
将src文件flags拷贝到destination,但是macOS系统python文件有一个特殊的flag0x80000
,这是普通用户无法设置的,即使是 root。
如果你用自制软件安装了 python,它没有这个标志,这个命令可以工作。
更新:
根据stat.h0x80000
是SF_RESTRICTED
:
#define SF_RESTRICTED 0x00080000 /* restricted access */
这是 Yosemite 系统完整性保护的新功能。
您可以在 ls -lO
输出中看到 restricted
标志:
$ ls -lO '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so'
-rwxr-xr-x 1 root wheel restricted,compressed 55888 Jul 15 12:21 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so
如果您尝试在命令行中设置它:
$ sudo chflags restricted tmp
chflags: tmp: Operation not permitted
我认为 python shutil.copystat
应该排除此标志,因为没有 Apple 分配的特殊权利,无法在用户区设置它。
我正在尝试运行这个命令
$ virtualenv --always-copy venv
然后我得到了所有这些错误:
shutil.Error: [('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Drag.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Drag.so'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Ctl.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Ctl.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Ctl.so'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/imageop.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/imageop.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/imageop.so'"),
('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Scrap.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Scrap.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_Scrap.so'"), ('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_testcapi.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_testcapi.so', "[Errno 1] Operation not permitted:
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/_testcapi.so'"),
('/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/unicodedata.so',
'/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/unicodedata.so', "[Errno 1] Operation not permitted: '/Users/antkong/dev/zeetings/venv/lib/python2.7/lib-dynload/unicodedata.so'"),
我检查了源文件的权限。都是可读的
$ ls -l '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so'
-rwxr-xr-x 1 root wheel 55936 3 Oct 16:50 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so
我一直确保 venv 在 运行 命令之前不存在。
那么为什么会失败?
版本信息:
$ python --version
Python 2.7.10
$ pip --version
pip 9.0.1 from /Library/Python/2.7/site-packages (python 2.7)
virtualenv使用shutil.copytree
拷贝文件,copytree
会用copystat
将src文件flags拷贝到destination,但是macOS系统python文件有一个特殊的flag0x80000
,这是普通用户无法设置的,即使是 root。
如果你用自制软件安装了 python,它没有这个标志,这个命令可以工作。
更新:
根据stat.h0x80000
是SF_RESTRICTED
:
#define SF_RESTRICTED 0x00080000 /* restricted access */
这是 Yosemite 系统完整性保护的新功能。
您可以在 ls -lO
输出中看到 restricted
标志:
$ ls -lO '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so'
-rwxr-xr-x 1 root wheel restricted,compressed 55888 Jul 15 12:21 /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_Drag.so
如果您尝试在命令行中设置它:
$ sudo chflags restricted tmp
chflags: tmp: Operation not permitted
我认为 python shutil.copystat
应该排除此标志,因为没有 Apple 分配的特殊权利,无法在用户区设置它。