2011-10-10 34 views
17

Tôi đang cố tạo gói nguồn python nhưng không thành công khi tạo liên kết cứng cho tệp.lỗi python setup.py sdist: Thao tác không được phép

$ 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 

Tôi đã thử chạy lệnh bằng sudo, nhưng nó cũng tạo ra lỗi tương tự.

này cũng sản xuất các lỗi tương tự:

ln foo bar 

Tôi đang sử dụng vbox để chạy một trường hợp ảo của ubuntu, mà có lẽ là nơi mà vấn đề bắt nguồn từ. Có cách nào sử dụng các liên kết cứng khi tạo bản phân phối nguồn không?

Thông tin hệ thống:

Máy chủ Ubuntu 11.04; VirtualBox 4.14; osx 10.6.6; python 2.7.1;

+0

bạn đang sử dụng phiên bản OS/python nào? –

+0

Tôi đang chạy máy chủ Ubuntu 11.04. Python 2.7.1 – rlayte

+0

Tôi đã có cùng một điều xảy ra trên máy Mac, trong khi cố gắng xây dựng một dự án python được truy cập thông qua một thư mục chia sẻ samba. –

Trả lời

9

Không rõ câu hỏi của bạn là bước nào không thành công. Có thể là liên kết cứng ngay trước lỗi. Bạn có thể thử strace để xem những gì hệ thống gọi là thất bại. Điều đó sẽ đưa ra một bức tranh tốt hơn về vấn đề này ít nhất.

This python bug report có vẻ như họ sẽ không sửa lỗi này cho đến khi distutils2. Ai đó đã cung cấp một bản vá có thể hữu ích cho bạn. Bạn cũng có thể gắn kết một thư mục trên NFS và xây dựng ở đó. Tôi tin rằng NFS cho phép liên kết cứng.

+0

Tôi đã thêm đầu ra từ cuộc gọi cuối cùng đến bài đăng. – rlayte

+0

Loại hệ thống tệp nào bạn đang chạy trên? Nó có thể không hỗ trợ liên kết cứng. –

+1

Điều đó có vẻ như vậy. Nếu tôi chạy 'ln foo bar', tôi sẽ gặp lỗi tương tự. Có một vòng theo cách này? Tôi đang chạy ubuntu thông qua vbox trên một máy chủ osx vì vậy tôi giả sử nó có cái gì để làm với không thể tạo ra các liên kết cứng trên một ổ đĩa ảo. – rlayte

16

Tôi đã gặp phải sự cố tương tự. Tôi có thể làm cho nó hoạt động bằng cách di chuyển các nguồn python từ thư mục chia sẻ hộp ảo đến thư mục nhà debian của tôi. Không có lỗi trên sdist nữa.

Tôi hy vọng điều đó sẽ hữu ích.

+3

Điều này làm việc cho tôi - bạn không thể tạo liên kết cứng trên một số ổ đĩa được gắn kết, tôi đoán vậy. –

+2

Đó là do vấn đề này: https://www.virtualbox.org/ticket/10085 –

17

Vấn đề tương tự. Tôi đang sử dụng lang thang, hệ điều hành máy chủ của tôi là Windows trong khi hệ điều hành Gust là Ubuntu. Tôi không phải là một fan hâm mộ vim, do đó, câu trả lời của @ simo không giúp tôi nhiều bởi vì tôi thực sự dựa vào hộp thư mục chia sẻ ảo để đồng bộ hóa các thay đổi được thực hiện bởi trình chỉnh sửa tuyệt vời cho máy ảo Ubuntu.

Nhờ Fabian Kochem, ông tìm thấy một workaround nhanh chóng và dơ bẩn: 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

Kiểm tra này không thành công nếu chạy dưới dạng root; Mà tôi tiếc là không thể tránh. :( – ThorSummoner

+1

@ThorSummoner Bạn có thể sử dụng 'del os.link' trực tiếp –

+0

@ThorSummoner Bạn không bị ràng buộc với điều kiện cụ thể đó. Bạn có thể phải sáng tạo tùy thuộc vào tình huống của riêng mình. Ví dụ: có thể bạn đặt' -vagrant 'trong tên thư mục đã đồng bộ hóa của bạn,' if '-vagrant' trong os.path.abspath (os.path.dirname (__ file __)): '... – Jamey

8

Trông như thế này đã được cố định trong phiên bản 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

0

Đây là cách tôi đạt đến một uwsgi làm việc (Ubuntu 14.04, mặc định Python 2.7.6) với Python-2.7.10.

bước

Trước khi tiếp tục, bạn phải biên dịch Python mới với --enable-shared:

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

Bối cảnh: Ubuntu 14.04 với Python 2.7.6 với uwsgi và uwsgi-python-plugin được cài đặt với apt- nhận được Vấn đề: Tôi có một virtualenv cho tất cả của tôi với biên dịch Python-2.7.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) 

Chuẩn bị thứ:

$ 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" 

Mở tập tin ini:

[uwsgi] 
plugins   = python27 

Kết quả trên:

** 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

Không ai trong số các câu trả lời ở trên giải quyết vấn đề của tôi. Tuy nhiên, tôi đã chạy lệnh sau đây trong một thư mục chia sẻ lang thang trên Centos 6:

python setup.py bdist_bdrpm 

Và kết thúc với các lỗi:

ln: creating hard link `xxx': Operation not permitted error: Bad exit status from /var/tmp/rpm-tmp.S9pTDl (%install)

Nó chỉ ra rằng đó là một tập tin bash mà cuối cùng thực thi liên kết cứng:

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 

Vì vậy, bạn sẽ có thể thay thế các liên kết cứng ln -f "$pyc" "$pyo" với một lệnh copy cp "$pyc" "$pyo" trong shell script ở trên.

Các vấn đề liên quan