Cosa c'è di sbagliato in questo `setup.py`?
-
06-07-2019 - |
Domanda
Ho avuto problemi con ottenere setup.py
per fare correttamente sdist
. L'ho ridotto a questo. Ho la seguente struttura di directory:
my_package\
my_subpackage\
__init__.py
deep_module.py
__init__.py
module.py
setup.py
Ed ecco cosa ho in setup.py
:
#!/usr/bin/env python
from distutils.core import setup
import distutils
setup(
name='a',
version='0.1',
description='a',
author='a',
author_email='a@a.com',
url='http://a.org',
packages=['my_package','my_package.my_subpackage'],
package_dir={'': '..'},
license= "a",
long_description = 'aaa',
)
(Le cose 'aaa'
sono solo segnaposto.)
Comunque, funziona bene quando faccio setup.py install
, ma quando provo a fare setup.py sdist
, accadono alcune cose curiose:
-
Viene creato un file
MANIFEST
. -
Viene creata una copia della cartella
my_package
dentro la cartellamy_package
esistente (anche se manca alcune delle impostazioni- file correlati credo.) -
Viene creata una cartella
dist
, al suo interno un file zip, all'interno di quella cartella con il nome del pacchetto, ma all'interno di quella cartella non c'è l'intero pacchetto come speravo, ma solo due file,setup.py
ePKG-INFO
.
Cosa sto facendo di sbagliato? Come faccio a far funzionare sdist
?
Soluzione
Invece di questo:
my_package\
my_subpackage\
__init__.py
deep_module.py
__init__.py
module.py
setup.py
Prova questo:
my_package_source\
setup.py
README.txt
my_package\
my_subpackage\
__init__.py
deep_module.py
__init__.py
module.py
In realtà non hai bisogno di un file README, è solo a scopo illustrativo per quale tipo di cose si trovano nella directory principale della cartella del tuo progetto.
=== EDIT ======================================
Dovrei elaborare. Dopo averlo eseguito, la tua directory dovrebbe assomigliare a questa:
my_package_source\
setup.py
README.txt
MANIFEST
PKG-INFO
dist\
my_package_0.X.tar.gz (or .zip on windows I believe)
my_package\
my_subpackage\
__init__.py
deep_module.py
__init__.py
module.py
Usa il pacchetto nella directory dist per distribuire.
Altri suggerimenti
Il problema è ben spiegato qui :
Setuptools ha molti errori silenziosi modalità. Uno di questi è il fallimento include tutti i file nella versione sdist (beh, non esattamente un fallimento, potresti RTFM, ma il comportamento predefinito è inaspettato). Questo post servirà come a google-stesso-risposta per questo problema, finché non diventiamo nuovi, più brillanti, Distribuire risolvendo tutti i nostri problemi.
Come sottolineano i commenti, il bug (errore di progettazione) è in realtà in distutils - setuptools non riesce a risolverlo (se stai usando svn, le cose sono in realtà un po 'migliori).
Posso riprodurre il tuo problema mentre lo osservi, ovvero accorciando un po 'i nomi dei file, ho:
$ ls -lR
total 8
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 __init__.py
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 modu.py
drwxr-xr-x 4 aleax eng 136 Oct 24 11:25 mysub
-rw-r--r-- 1 aleax eng 323 Oct 24 11:26 setup.py
./mysub:
total 0
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 __init__.py
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 deepmod.py
ed eseguendo python setup.py sdist
produce (così come avvertimenti):
$ ls -lR
total 16
-rw-r--r-- 1 aleax eng 104 Oct 24 11:35 MANIFEST
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 __init__.py
drwxr-xr-x 3 aleax eng 102 Oct 24 11:35 dist
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 modu.py
drwxr-xr-x 5 aleax eng 170 Oct 24 11:35 mypack
drwxr-xr-x 4 aleax eng 136 Oct 24 11:25 mysub
-rw-r--r-- 1 aleax eng 323 Oct 24 11:26 setup.py
./dist:
total 8
-rw-r--r-- 1 aleax eng 483 Oct 24 11:35 a-0.1.tar.gz
./mypack:
total 0
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 __init__.py
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 modu.py
drwxr-xr-x 4 aleax eng 136 Oct 24 11:35 mysub
./mypack/mysub:
total 0
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 __init__.py
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 deepmod.py
./mysub:
total 0
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 __init__.py
-rw-r--r-- 2 aleax eng 0 Oct 24 11:25 deepmod.py
Una soluzione è quella di cambiare il layout della directory come segue (dalla dir corrente del mypack):
$ mkdir mypack
$ mv __init__.py modu.py mysub/ mypack
$ touch README.txt
quindi ottenendo:
$ ls -lR
total 8
-rw-r--r-- 1 aleax eng 0 Oct 24 11:37 README.txt
drwxr-xr-x 5 aleax eng 170 Oct 24 11:37 mypack
-rw-r--r-- 1 aleax eng 323 Oct 24 11:26 setup.py
./mypack:
total 0
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 __init__.py
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 modu.py
drwxr-xr-x 4 aleax eng 136 Oct 24 11:25 mysub
./mypack/mysub:
total 0
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 __init__.py
-rw-r--r-- 1 aleax eng 0 Oct 24 11:25 deepmod.py
(e sbarazzarsi di uno degli avvertimenti, quello di README - quello di perdere MANIFEST.in rimane chiaramente ;-). Cambia anche una riga di setup.py in:
package_dir={'': '.'},
Ora, dopo python setup.py sdist
, ottieni un tarball decente:
$ tar tvf dist/a-0.1.tar.gz
drwxr-xr-x aleax/eng 0 2009-10-24 11:40:05 a-0.1/
drwxr-xr-x aleax/eng 0 2009-10-24 11:40:05 a-0.1/mypack/
-rw-r--r-- aleax/eng 0 2009-10-24 11:25:30 a-0.1/mypack/__init__.py
-rw-r--r-- aleax/eng 0 2009-10-24 11:25:30 a-0.1/mypack/modu.py
drwxr-xr-x aleax/eng 0 2009-10-24 11:40:05 a-0.1/mypack/mysub/
-rw-r--r-- aleax/eng 0 2009-10-24 11:25:30 a-0.1/mypack/mysub/__init__.py
-rw-r--r-- aleax/eng 0 2009-10-24 11:25:30 a-0.1/mypack/mysub/deepmod.py
-rw-r--r-- aleax/eng 156 2009-10-24 11:40:05 a-0.1/PKG-INFO
-rw-r--r-- aleax/eng 0 2009-10-24 11:37:41 a-0.1/README.txt
-rw-r--r-- aleax/eng 322 2009-10-24 11:39:46 a-0.1/setup.py
ovviamente il file MANIFEST è ancora creato nella tua directory attuale, ma spero che non sia un problema.