我正在尝试创建一个python源包,但在为文件创建硬链接时失败。
$ python setup.py sdist
running sdist
running check
reading manifest template 'MANIFEST.in'
writing manifest file 'MANIFEST'
making hard links in foo-0.1...
hard linking README.txt -> foo-0.1
error: Operation not permitted
我尝试用sudo运行命令,但它会产生同样的错误。
这也会产生同样的错误:
ln foo bar
我正在使用vbox来运行ubuntu的虚拟实例,这可能是问题的来源。在创建源代码分发时是否有使用硬链接的方法?
系统信息:
Ubuntu服务器11.04; VirtualBox 4.14; osx 10.6.6; python 2.7.1;
答案 0 :(得分:17)
同样的问题。我使用的是vagrant,我的主机操作系统是Windows,而Gust OS是Ubuntu。我不是vim粉丝,所以@ simo的答案对我没什么帮助,因为我真的依赖虚拟盒共享文件夹来将sublime编辑器所做的更改同步到Ubuntu虚拟机。
感谢Fabian Kochem,他找到了一个快速而肮脏的解决方法:post
# if you are not using vagrant, just delete os.link directly,
# The hard link only saves a little disk space, so you should not care
if os.environ.get('USER','') == 'vagrant':
del os.link
答案 1 :(得分:16)
我遇到了同样的问题。 通过将python源从虚拟盒共享文件夹移动到我的debian主文件夹,我能够使它工作。 sdist上没有错误。
我希望它有所帮助。
答案 2 :(得分:9)
从您的问题中不清楚哪一步失败了。可能是错误之前的硬链接。您可以尝试strace以查看哪些系统调用失败。这应该至少可以更好地描述问题。
This python bug report看起来他们不会在distutils2之前解决这个问题。有人提供了可能对您有用的补丁。您也可以通过NFS挂载目录并在那里构建。我相信NFS允许硬链接。
答案 3 :(得分:8)
在Python 2.7.9版本中修复了这个问题 - https://hg.python.org/cpython/raw-file/v2.7.9/Misc/NEWS
Issue #8876: distutils now falls back to copying files when hard linking
doesn't work. This allows use with special filesystems such as VirtualBox
shared folders
答案 4 :(得分:0)
这是我使用Python-2.7.10到达工作uwsgi(Ubuntu 14.04,默认Python 2.7.6)的方式。
<强>步骤强>
在继续之前,您必须使用--enable-shared
编译新的Python:
$ ./configure --enabled-shared
$ sudo make altinstall
上下文:Ubuntu 14.04与Python 2.7.6,uwsgi和uwsgi-python-plugin与apt-get一起安装 问题:我使用编译的Python-2.7.10
为我的所有人提供了一个virtualenv# Previously installed Python-2.7.10 as altinstall
$ python2.7
Python 2.7.10 (default, Nov 25 2015, 11:21:38)
$ source ~/env/bin/activate
$ python
Python 2.7.10 (default, Nov 25 2015, 11:21:38)
准备东西:
$ cd /tmp/
$ git clone https://github.com/unbit/uwsgi.git
$ cd uwsgi
$ make PROFILE=nolang
# On /tmp/uwsgi
$ PYTHON=python ./uwsgi --build-plugin "plugins/python python27"
在ini文件中:
[uwsgi]
plugins = python27
结果:
** Starting uWSGI 1.9.17.1-debian (64bit) on [Thu Nov 26 12:56:42 2015] ***
compiled with version: 4.8.2 on 23 March 2014 17:15:32
os: Linux-3.19.0-33-generic #38~14.04.1-Ubuntu SMP Fri Nov 6 18:17:28 UTC 2015
nodename: maquinote
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 12
current working directory: /etc/uwsgi/apps-enabled
detected binary path: /usr/bin/uwsgi-core
your processes number limit is 257565
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: enabled
uwsgi socket 0 bound to UNIX address /var/run/uwsgi/app/pypi-server/socket fd 3
Python version: 2.7.10 (default, Nov 26 2015, 11:44:40) [GCC 4.8.4]
答案 5 :(得分:0)
上述答案都没有解决我的问题。但是,我在Centos 6上的vagrant共享文件夹中运行以下命令:
python setup.py bdist_bdrpm
结束了错误:
ln:创建硬链接`xxx':不允许操作 错误:/var/tmp/rpm-tmp.S9pTDl(%install)
错误退出状态
事实证明,它是一个最终执行硬链接的bash文件:
cat /usr/lib/rpm/redhat/brp-python-hardlink
#!/bin/sh
# If using normal root, avoid changing anything.
if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then
exit 0
fi
# Hardlink identical *.pyc and *.pyo, originally from PLD's rpm-build-macros
# Modified to use sha1sum instead of cmp to avoid a diffutils dependency.
find "$RPM_BUILD_ROOT" -type f -name "*.pyc" | while read pyc ; do
pyo="$(echo $pyc | sed -e 's/.pyc$/.pyo/')"
if [ -f "$pyo" ] ; then
csha="$(sha1sum -b $pyc | cut -d' ' -f 1)" && \
osha="$(sha1sum -b $pyo | cut -d' ' -f 1)" && \
if [ "$csha" = "$osha" ] ; then
ln -f "$pyc" "$pyo"
fi
fi
done
因此,您应该能够使用上述shell脚本中的复制命令ln -f "$pyc" "$pyo"
替换硬链接cp "$pyc" "$pyo"
。