python3 - MANIFEST.in ignorado en "python setup.py install"-¿no hay archivos de datos instalados?
python setup.py install windows (5)
Aquí está mi script setup.py simplificado sin el código eliminado:
#!/usr/bin/env python
from distutils.core import setup
from whyteboard.misc import meta
setup(
name = ''Whyteboard'',
version = meta.version,
packages = [''whyteboard'', ''whyteboard.gui'', ''whyteboard.lib'', ''whyteboard.lib.pubsub'',
''whyteboard.lib.pubsub.core'', ''whyteboard.lib.pubsub.utils'', ''whyteboard.misc''],
py_modules = [''whyteboard''],
scripts = [''whyteboard.py''],
)
MANIFEST.in:
include *.txt
include whyteboard-help/*.*
recursive-include locale *.mo
recursive-include images *.png
Cuando ejecuto "python setup.py install sdist" obtengo un bonito .tar.gz con una carpeta raíz "whyteboard-0.41", con mi configuración regional / imágenes / y whyteboard-help / carpetas dentro. Esto también tiene mi script de whyteboard.py que ejecuta mi programa desde el paquete fuente de whyteboard.
Asi que:
whyteboard/
├── locale/
├── images
├── whyteboard-help/
├── whyteboard/
│ ├── __init__.py
│ └── other packages etc
├── whyteboard.py
├── README
├── setup.py
└── CHANGELOG
Esto refleja la fuente de mi programa, es cómo todo debe ser y es correcto.
Sin embargo, cuando ejecuto "python setup.py install", ninguno de mis archivos de datos está escrito, solo el paquete fuente "whyteboard", y el whyteboard.py está ubicado en /usr/local/lib/python2.6/dist-packages/ .
Idealmente, me gustaría que la misma estructura de directorio que se genera en el archivo .tar.gz se cree en los paquetes dist, ya que así es como mi programa espera buscar sus recursos.
¿Cómo puedo obtener "instalar" para crear esta estructura de directorios? Parece que está ignorando mi archivo de manifiesto, por lo que puedo decir.
Al ejecutar python 2.6.1 en Mac OSX, no tuve ninguna suerte, excepto mediante el uso del parámetro data_files en setup.py. Todo con MANIFEST.in simplemente resultó en que los archivos se incluyeran en el paquete dist, pero nunca se instalaron. Revisé algunos otros paquetes y de hecho estaban usando archivos de datos para especificar archivos adicionales.
Creé una función corta para ayudar a enumerar todos los archivos de un árbol de directorios en el
(target_dir, [lista de archivos]) formato que data_files espera:
def gen_data_files(*dirs):
results = []
for src_dir in dirs:
for root,dirs,files in os.walk(src_dir):
results.append((root, map(lambda f:root + "/" + f, files)))
return results
Ahora puedo llamar a esto dentro de mi llamada de configuración:
setup(... data_files = gen_data_files("docs", "lib") ...
Y todo en esos árboles se instala.
Algunas notas además de la respuesta de Ned (que afecta al problema central):
Distutils no instala paquetes y módulos de Python dentro de un subdirectorio por proyecto dentro site-packages
(o dist-packages
en Debian / Ubuntu): se instalan directamente en site-packages
, como ha visto. Por lo tanto, el directorio whyteboard-xx
contiene en su sdist no existirá en el formulario final instalado.
Una consecuencia de esto es que debe tener cuidado de data_files
un nombre a sus data_files
de data_files
de manera que aclare a qué proyecto pertenecen, ya que esos archivos / directorios se instalan directamente en el directorio de site-packages
global, no dentro de ningún directorio de whyteboard
.
O en lugar de eso, podría hacer que sus datos whyteboard
paquete whyteboard
(lo que significa que debe vivir dentro de ese paquete, es decir, junto a __init__.py
), y entonces esto no sea un problema.
Por último, no tiene mucho sentido tener un módulo py_modules
en py_modules
y un whyteboard/__init__.py
en los packages
. Los dos se excluyen mutuamente, y si tiene ambos, el módulo whyteboard.py
será ignorado por las importaciones a favor del paquete del mismo nombre.
Si whyteboard.py
es solo un script y no está destinado a ser importado, entonces debe usar la opción de scripts para él y eliminarlo de py_modules
.
Debe utilizar setuptools:
#!/usr/bin/env python
from setuptools import setup, find_packages
from whyteboard.misc import meta
setup(
name = ''Whyteboard'',
version = meta.version,
packages = find_packages(),
include_package_data=True,
py_modules = [''whyteboard''],
scripts = [''whyteboard.py''],
)
Esto no es realmente usar el archivo MANIFEST para hacer el trabajo, pero incluye todos los archivos necesarios.
No pude entender por qué mi archivo MANIFEST.in
se estaba ignorando cuando ejecuté python setup.py install
- resulta include_package_data=True
resuelve el problema. La opción package_data
no es realmente requerida.
MANIFEST.in
le dice a Distutils qué archivos incluir en la distribución de origen, pero no afecta directamente a qué archivos están instalados. Para eso necesita incluir los archivos apropiados en el archivo setup.py
, generalmente como datos de paquete o como archivos adicionales .