setup python3 modulenotfounderror python build install distutils

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 .