python setup.py sdist错误:不允许操作

时间:2011-10-10 22:26:20

标签: python unix ubuntu virtualbox distutils

我正在尝试创建一个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;

6 个答案:

答案 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"