2011-10-10 124 views
17

我試圖創建一個python源代碼包,但創建文件的硬鏈接時失敗。python setup.py sdist錯誤:不允許操作

$ 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

你使用的是什麼操作系統/ python版本? –

+0

我正在運行Ubuntu服務器11.04。 Python 2.7.1 – rlayte

+0

我在Mac上嘗試構建一個通過samba共享文件夾訪問的python項目時,發生了同樣的情況。 –

回答

9

從你的問題來看,目前還不清楚哪一步失敗。可能是錯誤發生之前的硬鏈接。您可以嘗試strace以查看哪些系統調用失敗。至少應該能夠更好地瞭解問題。

This python bug report看起來他們不會去解決這個問題,直到distutils2。有人提供了一個可能對你有用的補丁。你也許可以通過NFS掛載一個目錄並在那裏建立。我相信NFS允許硬連接。

+0

我已將最後調用的輸出添加到帖子中。 – rlayte

+0

你在運行什麼類型的文件系統?它可能不支持硬鏈接。 –

+1

這似乎是它。如果我運行'ln foo bar',我會得到相同的錯誤。有沒有辦法解決這個問題?我在osx主機上通過vbox運行ubuntu,所以我認爲它與不能在虛擬驅動器上創建硬鏈接有關。 – rlayte

16

我遇到了同樣的問題。 我能夠通過將虛擬框共享文件夾中的Python源代碼移動到我的debian主文件夾中來實現它。 sdist再也沒有錯誤了。

我希望它有幫助。

+3

這對我有用 - 我想,你無法在某些裝入的捲上創建硬鏈接。 –

+2

這是由於這個問題:https://www.virtualbox.org/ticket/10085 –

17

同樣的問題。我使用流浪漢,我的主機操作系統是Windows,而Gust OS是Ubuntu。我不是一個vim粉絲,所以@ simo的回答對我來說幫不了多少忙,因爲我真的依靠虛擬機箱共享文件夾來將由sublime編輯器所做的更改同步到Ubuntu虛擬機。

感謝費邊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 
+0

如果以root身份運行,此檢查將失敗;我不幸無法避免。 :( – ThorSummoner

+1

@ThorSummoner你可以直接使用'del os.link' –

+0

@ThorSummoner你並沒有被束縛在特定的條件下,你可能必須根據自己的情況來創造性,例如,你可能會把'-vagrant '在你的同步文件夾名稱中,'if'-vagrant'in os.path.abspath(os.path.dirname(__ file __)):'... – Jamey

0

這是我使用Python-2.7.10實現了工作uwsgi(Ubuntu 14.04,默認Python 2.7.6)。

步驟

在繼續之前,您必須編譯新的Python與--enable-shared

$ ./configure --enabled-shared 
$ sudo make altinstall 

語境的Ubuntu 14.04使用Python 2.7.6與APT-安裝uwsgi和uwsgi-蟒蛇,插件得到 問題:我爲編譯Python-2.7的所有人準備了virtualenv。10

# 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] 
0

以上答案都不對解決我的問題。但是,我是在一個無業遊民的共享文件夾運行在CentOS 6以下命令:

python setup.py bdist_bdrpm 

,結束了與錯誤:

ln: creating hard link `xxx': Operation not permitted error: Bad exit status from /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腳本複製命令cp "$pyc" "$pyo"硬鏈接ln -f "$pyc" "$pyo"

相關問題