Como faço para setup.py
incluir um arquivo que não faz parte do código? (Especificamente, é um arquivo de licença, mas pode ser qualquer outra coisa.)
Quero poder controlar o local do arquivo. Na pasta de origem original, o arquivo está na raiz do pacote. (ou seja, no mesmo nível da parte superior __init__.py
.) Quero que ele fique exatamente lá quando o pacote for instalado, independentemente do sistema operacional. Como faço isso?
data_files = [('', ['lgpl2.1_license.txt',]),]
coloca na pasta Python26.Respostas:
Provavelmente, a melhor maneira de fazer isso é usar a
setuptools
package_data
diretiva. Isso significa usarsetuptools
(oudistribute
) em vez dedistutils
, mas essa é uma "atualização" muito simples.Aqui está um exemplo completo (mas não testado):
Observe as linhas específicas que são críticas aqui:
package_data
é um nomedict
de pacote (vazio = todos os pacotes) para uma lista de padrões (pode incluir globs). Por exemplo, se você deseja especificar apenas arquivos no seu pacote, também pode fazer isso:A solução aqui definitivamente não é renomear seus
py
arquivos não com uma.py
extensão.Vejo a apresentação de Ian Bicking para mais informações.
UPDATE: Outra abordagem [melhor]
Outra abordagem que funciona bem se você deseja apenas controlar o conteúdo da distribuição de origem (
sdist
) e ter arquivos fora do pacote (por exemplo, diretório de nível superior) é adicionar umMANIFEST.in
arquivo. Veja a documentação do Python para o formato deste arquivo.Desde que escrevi essa resposta, descobri que o uso
MANIFEST.in
normalmente é uma abordagem menos frustrante para garantir apenas a sua distribuição de origem (tar.gz
) possua os arquivos necessários.Por exemplo, se você deseja incluir o
requirements.txt
nível superior, inclua recursivamente o diretório "dados" de nível superior:No entanto, para que esses arquivos sejam copiados no momento da instalação para a pasta do pacote dentro dos pacotes do site, você precisará fornecer
include_package_data=True
asetup()
função. Consulte Adicionando arquivos que não são de código para obter mais informações.fonte
Para realizar o que você está descrevendo, serão necessários dois passos ...
Etapa 1: para adicionar o arquivo ao tarball de origem, inclua-o no MANIFEST
Crie um modelo MANIFEST na pasta que contém setup.py
O MANIFEST é basicamente um arquivo de texto com uma lista de todos os arquivos que serão incluídos no tarball de origem.
Aqui está a aparência do MANIFEST para o meu projeto:
Nota: Enquanto sdist faz adicionar alguns arquivos automaticamente , prefiro especificá-los explicitamente para ter certeza em vez de prever o que ele faz e não faz.
Etapa 2: para instalar o arquivo de dados na pasta de origem, modifique setup.py
Como você deseja adicionar um arquivo de dados (LICENSE.txt) à pasta de instalação de origem, é necessário modificar o caminho de instalação de dados para corresponder ao caminho de instalação de origem. Isso é necessário porque, por padrão, os arquivos de dados são instalados em um local diferente dos arquivos de origem.
Para modificar o diretório de instalação de dados para corresponder ao diretório de instalação de origem ...
Puxe as informações do diretório de instalação do distutils com:
Modifique o diretório de instalação de dados para corresponder ao diretório de instalação de origem:
E adicione o arquivo de dados e o local em setup ():
Nota: As etapas acima devem realizar exatamente o que você descreveu de maneira padrão, sem a necessidade de bibliotecas de extensão.
fonte
package_data
, não funcionará se o arquivo não estiver no pacote.crie
MANIFEST.in
na raiz do projeto comrecursive-include
o diretório necessário ouinclude
com o nome do arquivo.documentação pode ser encontrada aqui
fonte
Eu queria postar um comentário em uma das perguntas, mas não tenho reputação suficiente para isso>.>
Aqui está o que funcionou para mim (depois de consultar os documentos):
Estranhamente, a última linha também foi crucial para mim (você também pode omitir esse argumento de palavra-chave - funciona da mesma maneira).
O que isso faz é copiar todos os arquivos de texto em seu diretório raiz ou de nível superior (um nível acima do pacote
mypkg
você deseja distribuir).Espero que isto ajude!
fonte
MANIFEST.in
, isso funcionou para mim. A última linha também foi crucial para mim. Minhas linhas eraminclude_package_data=False, package_data={ "": ["../CHANGELOG.md"] },
Etapa 1: crie um
MANIFEST.in
arquivo na mesma pasta com setup.pyEtapa 2: inclua o caminho relativo para os arquivos que você deseja adicionar
MANIFEST.in
Etapa 3: defina
include_package_data=True
asetup()
função para copiar esses arquivos no pacote do siteA referência está aqui.
fonte
É 2019 e aqui está o que está funcionando - apesar dos conselhos aqui e ali, o que eu encontrei na internet que meio documentado está usando
setuptools_scm
, passou como opções parasetuptools.setup
. Isso incluirá todos os arquivos de dados com versão em seu VCS, seja git ou qualquer outro, no pacote wheel e fará "pip install" a partir do repositório git para trazer esses arquivos.Então, acabei de adicionar essas duas linhas à chamada de instalação em "setup.py". Nenhuma instalação extra ou importação requerida:
Não há necessidade de listar manualmente package_data ou em um arquivo MANIFEST.in - se estiver com versão, ele será incluído no pacote. Os documentos sobre "setuptools_scm" enfatizam a criação de um número de versão a partir da posição de confirmação e desconsideram a parte realmente importante da adição dos arquivos de dados. (Não posso me importar menos se meu arquivo de roda intermediária for nomeado "* 0.2.2.dev45 + g3495a1f" ou usará o número da versão codificada "0.3.0dev0" que eu digitei - mas deixando arquivos cruciais para o programa trabalho por trás é um pouco importante)
fonte
Em setup.py em setup (:
fonte
package_data
não terá influência sobre o quesetup.py install
faz, a menos que você modifique o próprio comando install. A menos que esses arquivos estejam no diretório do pacote, o que geralmente é algo que você deseja evitar.Aqui está uma resposta mais simples que funcionou para mim.
Primeiro, pelo comentário de um desenvolvedor Python acima, setuptools não é necessário:
Isso é ótimo porque colocar um requisito setuptools em seu pacote significa que você precisará instalá-lo também. Em resumo:
fonte
pkgame
não existeEu só queria acompanhar algo que encontrei ao trabalhar com o Python 2.7 no Centos 6. A adição de package_data ou data_files como mencionado acima não funcionou para mim. Adicionei um MANIFEST.IN aos arquivos que eu queria, que colocou os arquivos não-python no tarball, mas não os instalou na máquina de destino via RPM.
No final, consegui colocar os arquivos em minha solução usando as "opções" nas ferramentas de configuração / instalação. Os arquivos de opções permitem modificar várias seções do arquivo de especificação em setup.py. Do seguinte modo.
arquivo - MANIFEST.in:
arquivo - com os comandos de instalação:
fonte
Descobri uma solução alternativa: renomeei meu nome
lgpl2.1_license.txt
paralgpl2.1_license.txt.py
e coloquei algumas aspas triplas ao redor do texto. Agora não preciso usar adata_files
opção nem especificar caminhos absolutos. Torná-lo um módulo Python é feio, eu sei, mas o considero menos feio do que especificar caminhos absolutos.fonte