Provavelmente, a melhor maneira de fazer isso é usar a setuptools
package_data
diretiva. Isso significa usar setuptools
(ou distribute
) em vez de distutils
, mas essa é uma "atualização" muito simples.
Aqui está um exemplo completo (mas não testado):
from setuptools import setup, find_packages
setup(
name='your_project_name',
version='0.1',
description='A description.',
packages=find_packages(exclude=['ez_setup', 'tests', 'tests.*']),
package_data={'': ['license.txt']},
include_package_data=True,
install_requires=[],
)
Observe as linhas específicas que são críticas aqui:
package_data={'': ['license.txt']},
include_package_data=True,
package_data
é um nome dict
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:
package_data={'yourpackage': ['*.txt', 'path/to/resources/*.txt']}
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 um MANIFEST.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:
include requirements.txt
recursive-include data *
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
a setup()
função. Consulte Adicionando arquivos que não são de código para obter mais informações.