Este é o meu script setup.py simplificado com coisas que não são de código removidas:
#!/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
Quando executo "python setup.py install sdist", recebo um bom .tar.gz com uma pasta raiz "whyteboard-0.41", com meu locale / images / e whyteboard-help / pastas dentro. Isso também contém meu script whyteboard.py que inicia meu programa de dentro do pacote fonte whyteboard.
Então:
whyteboard/
├── locale/
├── images
├── whyteboard-help/
├── whyteboard/
│ ├── __init__.py
│ └── other packages etc
├── whyteboard.py
├── README
├── setup.py
└── CHANGELOG
Isso reflete a fonte do meu programa, é como tudo deveria ser e está correto.
No entanto, quando executo "python setup.py install", nenhum dos meus arquivos de dados é gravado - apenas o pacote fonte "whyteboard", e whyteboard.py é colocado em /usr/local/lib/python2.6/dist-packages/ .
Idealmente, eu gostaria que a mesma estrutura de diretório que foi gerada no arquivo .tar.gz fosse criada em dist-packages, pois é assim que meu programa espera procurar seus recursos.
Como posso obter "instalar" para criar essa estrutura de diretório? Parece estar ignorando meu arquivo de manifesto, pelo que posso dizer.
fonte
Respostas:
Algumas observações além da resposta de Ned (que atinge o problema central):
O Distutils não instala pacotes e módulos Python dentro de um subdiretório por projeto
site-packages
(oudist-packages
no Debian / Ubuntu): eles são instalados diretamentesite-packages
, como você viu. Portanto, owhyteboard-xx
diretório que contém em seu sdist não existirá na forma final instalada.Uma implicação disso é que você deve ter cuidado ao nomear o seu
data_files
de uma forma que esclareça a qual projeto eles pertencem, porque esses arquivos / diretórios são instalados diretamente nosite-packages
diretório global , não dentro de qualquerwhyteboard
diretório contido .Ou você pode criar seus dados
package_data
dowhyteboard
pacote (o que significa que ele precisa estar dentro desse pacote, ou seja, próximo a__init__.py
), e então isso não será um problema.Por último, não faz muito sentido ter um
whyteboard.py
módulopy_modules
e umwhyteboard/__init__.py
pacotepackages
. Os dois são mutuamente exclusivos e, se você tiver os dois, owhyteboard.py
módulo será ignorado pelas importações em favor do pacote de mesmo nome.Se
whyteboard.py
for apenas um script e não se destina a ser importado, você deve usar a opção de scripts para ele e removê-lopy_modules
.fonte
MANIFEST.in
diz ao Distutils quais arquivos incluir na distribuição de origem, mas não afeta diretamente quais arquivos são instalados. Para isso, você precisa incluir os arquivos apropriados nosetup.py
arquivo, geralmente como dados de pacote ou como arquivos adicionais .fonte
Não consegui descobrir por que meu
MANIFEST.in
arquivo estava sendo ignorado quando corripython setup.py install
-include_package_data=True
resolveu o problema. Apackage_data
opção não é realmente necessária.fonte
include_package_data=True
não é o valor padrão?Executando o python 2.6.1 no Mac OSX, não tive absolutamente nenhuma sorte, exceto usando o data_files parâmetro em setup.py. Tudo com MANIFEST.in simplesmente resultou na inclusão de arquivos no pacote dist, mas nunca na instalação. Eu verifiquei alguns outros pacotes e eles estavam realmente usando data_files para especificar arquivos adicionais.
Eu criei uma função curta para ajudar a enumerar todos os arquivos de uma árvore de diretório no
(target_dir, [lista de arquivos]) 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
Agora posso apenas chamar isso dentro da minha chamada de configuração:
setup(... data_files = gen_data_files("docs", "lib") ...
E tudo nessas árvores é instalado.
fonte
Você deve usar ferramentas de configuração:
#!/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'], )
Na verdade, isso não está usando o arquivo MANIFEST para fazer o trabalho, mas inclui todos os arquivos necessários.
fonte
package_data
dicionário aparecerem no lugar certo somente após eu adicionarinclude_package_data=Tru
.Exemplo de execução mínima publicado
Conclusão importante: só
MANIFEST.in
funcionou para mim,package_data
não funcionou.Testado no Ubuntu 19.10, Python 3.7.5, wheel == 0.32.3, setuptools == 41.1.0, twine == 3.1.1.
Como os usuários finais usam o pacote de https://pypi.org/project/python-sample-package-with-data/ :
python3 -m pip install --user python-sample-package-with-data python-sample-package-with-data
Saída esperada:
Como os mantenedores o publicam:
# One time setup. python3 -m pip install --user setuptools wheel twine # Every time you want to publish. python setup.py sdist bdist_wheel twine upload dist/* rm -rf build dist *.egg-info
Os arquivos reais:
MANIFEST.in
# Or else pip install cannot find README.md on the setup.py under certain conditions. include README.md # This actually adds the data file. include python_sample_package_with_data/mydata.txt
python-sample-package-with-data
#!/usr/bin/env python3 import python_sample_package_with_data print(python_sample_package_with_data.get_data(), end='')
python_sample_package_with_data / __ init__.py
try: import importlib.resources as importlib_resources except ImportError: # In PY<3.7 fall-back to backported `importlib_resources`. import importlib_resources def get_data(): return importlib_resources.read_text(__name__, 'mydata.txt')
python_sample_package_with_data / mydata.txt
setup.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from setuptools import setup, find_packages from os import path this_directory = path.abspath(path.dirname(__file__)) with open(path.join(this_directory, 'README.md')) as f: long_description = f.read() setup( name='python-sample-package-with-data', version='0.0.3', description='My short description', long_description=long_description, long_description_content_type='text/markdown', url='https://github.com/cirosantilli/python-sample-package-with-data', author='Ciro Santilli', author_email='[email protected]', packages=find_packages(), include_package_data=True, scripts=['python-sample-package-with-data'], )
Bibliografia:
fonte