2011-10-10 31 views
17

Sto provando a creare un pacchetto sorgente Python, ma non riesce durante la creazione di collegamenti fisici per i file.python setup.py Errore sdist: Operazione non consentita

$ 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 

Ho provato a eseguire il comando con sudo, ma produce lo stesso errore.

questo produce anche lo stesso errore:

ln foo bar 

sto usando VBOX per eseguire un'istanza virtuale di ubuntu, che è probabilmente dove il problema proviene. C'è un modo per utilizzare gli hard link durante la creazione di distribuzioni di origine?

Informazioni di sistema:

Server Ubuntu 11.04; VirtualBox 4.14; osx 10.6.6; python 2.7.1;

+0

quale versione di OS/python stai usando? –

+0

Sto usando il server Ubuntu 11.04. Python 2.7.1 – rlayte

+0

Ho fatto accadere la stessa cosa su un Mac, mentre cercavo di creare un progetto Python accessibile tramite una cartella condivisa di samba. –

risposta

9

Non è chiaro dalla domanda in che fase si sta verificando un errore. Potrebbe essere l'hard link proprio prima dell'errore. Puoi provare strace per vedere quale chiamata di sistema sta fallendo. Questo dovrebbe dare almeno un'immagine migliore del problema.

This python bug report sembra che non lo risolveranno fino a distutils2. Qualcuno ha fornito una patch che potrebbe esserti utile. Potresti anche essere in grado di montare una directory su NFS e creare lì. Credo che NFS consenta il collegamento duro.

+0

Ho aggiunto l'output dall'ultima chiamata al post. – rlayte

+0

Che tipo di filesystem stai usando? Potrebbe non supportare i collegamenti fisici. –

+1

Sembra che sia così. Se eseguo 'ln foo bar' ottengo lo stesso errore. C'è un modo per aggirare questo? Sto usando Ubuntu tramite vbox su un host osx quindi presumo abbia qualcosa a che fare con il fatto di non essere in grado di creare hard link su un disco virtuale. – rlayte

16

Mi sono imbattuto negli stessi problemi. Sono riuscito a farlo funzionare spostando i sorgenti python dalla cartella condivisa della virtual box alla mia cartella home debian. Nessun errore su sdist più.

Spero che aiuti.

+3

Questo ha funzionato per me - non è possibile creare collegamenti rigidi su alcuni volumi montati, suppongo. –

+2

È a causa di questo problema: https://www.virtualbox.org/ticket/10085 –

17

Stesso problema. Sto usando vagabondo, il mio sistema operativo host è Windows mentre il Gust OS è Ubuntu. Non sono un fan accanito, quindi la risposta di @ simo non mi aiuta molto perché mi affido alle cartelle condivise di virtual box per sincronizzare le modifiche apportate dall'editor sublime alla macchina virtuale di Ubuntu.

Grazie a Fabian Kochem, ha trovato una soluzione rapida e sporca: 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

Questo controllo fallisce se eseguito come root; Che purtroppo non posso evitare. :( – ThorSummoner

+1

@ThorSummoner Puoi usare direttamente 'del os.link ' –

+0

@ThorSummoner Non sei legato a quella particolare condizione, potresti dover essere creativo a seconda della tua situazione.Per esempio, potresti inserire' -vagrant 'nei nomi delle cartelle sincronizzate,' if '-vagrant' in os.path.abspath (os.path.dirname (__ file __)): '... – Jamey

8

Sembra che questo è stato risolto nella versione di 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

Questa è la Ho raggiunto un uwsgi funzionante (Ubuntu 14.04, predefinito Python 2.7.6) con Python-2.7.10.

Passi

Prima di continuare, è necessario compilare nuova Python con --enable-shared:

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

Contesto: Ubuntu 14.04 con Python 2.7.6 con uwsgi e uwsgi-python-plugin installato con apt- get Problema: ho un virtualenv per il mio tutto con Python-2.7 compilato.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) 

roba Preparazione:

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

On file ini:

[uwsgi] 
plugins   = python27 

Risultati su:

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

Nessuna delle risposte di cui sopra ha risolto il mio problema. Tuttavia, ho girato il seguente comando in una cartella condivisa vagabonda su CentOS 6:

python setup.py bdist_bdrpm 

e finito con l'errore:

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

Si scopre che si tratta di un file bash che alla fine esegue la hard link:

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 

quindi si dovrebbe essere in grado di sostituire l'hard link ln -f "$pyc" "$pyo" con un comando di copia cp "$pyc" "$pyo" nello script di shell sopra.

Problemi correlati