Ao usar setuptools / distribut, não consigo fazer com que o instalador puxe nenhum package_data
arquivo. Tudo o que li diz que o seguinte é a maneira correta de fazer isso. Alguém pode aconselhar?
setup(
name='myapp',
packages=find_packages(),
package_data={
'myapp': ['data/*.txt'],
},
include_package_data=True,
zip_safe=False,
install_requires=['distribute'],
)
onde myapp/data/
é o local dos arquivos de dados.
python
setuptools
distribute
cmcginty
fonte
fonte
data_files
resolveu o problema. Mas isso é propenso a erros e não "parece certo" para mim. Alguém pode verificar se é realmente necessário duplicar a configuração em ambospackage_data
edata_files
?pyproject.toml
. Nenhumsetup.py
arquivo é necessário.Respostas:
Percebo que essa é uma pergunta antiga, mas para as pessoas que estão chegando aqui pelo Google:
package_data
é uma mentira humilde e suja . É usado apenas ao criar pacotes binários (python setup.py bdist ...
), mas não ao criar pacotes de origem (python setup.py sdist ...
). Isso é, obviamente, ridículo - seria de esperar que a construção de uma distribuição de origem resultasse em uma coleção de arquivos que poderiam ser enviados a outra pessoa para construir a distribuição binária.De qualquer forma, o uso
MANIFEST.in
funcionará tanto para distribuições binárias quanto para fontes.fonte
package_data
trabalha parabdist
e nãosdist
. No entanto ,MANIFEST.in
funciona parasdist
, mas não parabdist
! Portanto, o melhor que pude sugerir é incluir ambospackage_data
eMANIFEST.in
para acomodar ambosbdist
esdist
.MANIFEST.in
para arquivos que você não instala, como documentação epackage_data
para arquivos que não são código Python (como uma imagem ou modelo).MANIFEST.in
epackage_data
. Parece queMANIFEST.in
controla o que está incluído na distribuição e package_data controla o que posteriormente é copiado no diretório site_packages durante a instalação. De maneira confusa, os caminhos emMANIFEST.in
são relativos à localização do setup.py epackage_data
à raiz dos pacotes individuais (por exemplo, módulos).package_data
sendo incluídos automaticamente no ZIP se você não tiver o arquivo MANIFEST.in existente e somente se estiver usando o 2.7+.Eu apenas tive esse mesmo problema. A solução foi simplesmente remover
include_package_data=True
.Depois de ler aqui , percebi que o
include_package_data
objetivo é incluir arquivos do controle de versão , em vez de apenas "incluir dados do pacote", como o nome indica. Dos documentos:Retirar esse argumento, corrigi-lo, o que é coincidentemente o motivo pelo qual ele também funcionou quando você mudou para o distutils, já que ele não aceita esse argumento.
fonte
include_package_data=True
entrada. A única solução para mim é adicionar uma entrada no manifesto, como sugerido acima. Você mente que eu estava usando setuptools, talvez sua versão funcione com 'distribuir'?include_package_data
resolve o problema é mais aprofundado no texto original - Se você usar oinclude_package_data
argumento específico do setuptools , os arquivos especificados porpackage_data
não serão automaticamente adicionados ao manifesto, a menos que estejam listados noMANIFEST.in
arquivo.package_data
definido para uma lista não-vazia e especificadoinclude_package_data=False
? E por que você precisaria especificar arquivos duas vezesMANIFEST.in
epackage_data
?Seguir a recomendação de @Joe para remover a
include_package_data=True
linha também funcionou para mim.Para elaborar um pouco mais, não tenho nenhum
MANIFEST.in
arquivo. Eu uso o Git e não o CVS.O repositório assume esse tipo de forma:
setup.py
:Eu corro
python setup.py sdist
para um distrib de origem (não tentei binário).E quando dentro de um novo ambiente virtual, tenho um
myproject-4.19.tar.gz
arquivo e usoE além de tudo que está sendo instalado no meu ambiente virtual
site-packages
, esses arquivos de dados especiais são instalados no/opt/local/myproject/data
e/opt/local/myproject/etc
.fonte
include_package_data=True
trabalhou para mim.Se você usar git, lembre-se de incluir
setuptools-git
noinstall_requires
. Muito menos chato do que ter umManifest
ou incluir todo o caminhopackage_data
(no meu caso, é um aplicativo django com todo tipo de estática)(colei o comentário que fiz, como o k3-rnc mencionou, é realmente útil como está)
fonte
Atualização : esta resposta é antiga e as informações não são mais válidas. Todas as configurações do setup.py devem ser usadas
import setuptools
. Adicionei uma resposta mais completa em https://stackoverflow.com/a/49501350/64313Eu resolvi isso mudando para distutils. Parece que a distribuição está obsoleta e / ou quebrada.
fonte
include_package_data=True
não estava sendo respeitado. Portanto, com essa configuração, você só precisa do MANIFEST.in - não é necessário duplicar sua lista de arquivos napackage_data
configuração.Pergunta antiga e ainda ... o gerenciamento de pacotes do python realmente deixa muito a desejar. Portanto, tive o caso de uso de instalar o pip localmente em um diretório especificado e fiquei surpreso que os caminhos package_data e data_files não funcionassem. Como não estava interessado em adicionar outro arquivo ao repositório, acabei aproveitando os arquivos data_files e setup.py --install-data; algo assim
fonte
Mover a pasta que contém os dados do pacote para a pasta do módulo resolveu o problema para mim.
Veja esta pergunta: MANIFEST.in ignorado em "python setup.py install" - nenhum arquivo de dados instalado?
fonte
Eu tive o mesmo problema por alguns dias, mas mesmo esse segmento não foi capaz de me ajudar, pois tudo estava confuso. Então, eu fiz minha pesquisa e encontrei a seguinte solução:
A outra resposta completa do stackoverflow aqui
fonte
Basta remover a linha:
do seu script de instalação e funcionará bem. (Testado agora com as ferramentas de instalação mais recentes.)
fonte
sdist
ebdist_wheel
, você já verificou por quê?sdist
ignorapackage_data
quando isso está definido.Usando o setup.cfg (setuptools ≥ 30.3.0)
A partir do setuptools 30.3.0 (lançado em 12/12/2016), você pode manter o
setup.py
tamanho muito pequeno e mover a configuração para umsetup.cfg
arquivo. Com essa abordagem, você pode colocar os dados do pacote em uma[options.package_data]
seção:Nesse caso, você
setup.py
pode ser tão curto quanto:Para obter mais informações, consulte a configuração usando os arquivos setup.cfg .
Há alguma conversa de depreciativo
setup.cfg
a favor depyproject.toml
como proposto na PEP 518 , mas isso ainda é provisória a partir de 2020/02/21.fonte
pip install
.pip install
, para versões bastante modernas do pip, primeiro constrói uma roda e depois a instala. Ainda para muitos usuários, essa abordagem silenciosamente falha ao incluir dados do pacote. Veja a resposta aceita e os comentários abaixo para obter detalhes sobre isso. Usar asetup.cfg
é realmente apenas uma maneira diferente de escrever o que o OP já estava fazendo nasetup.py
pergunta (passando opackage_data
argumento da palavra - chave na chamada parasetup
), então não acho que isso seja particularmente útil como resposta para essa pergunta . Não está resolvendo o problema subjacente.