2017-05-22 1 views
0

J'essaie de créer un package pour mon projet, en utilisant setup.py et setuptools. Une recherche générale a suggéré que les fichiers de données devraient être placés sous mon paquet python.
Par exemple, project/src/package/data. Mais ma situation est plus conforme à this question.Installation d'un répertoire complet de fichiers de données

Mon projet consiste en une application console Python et une application interactive HTML. À l'heure actuelle (avant setup.py), j'ai l'application console copier les fichiers HTML dans un répertoire spécifique avec une commande spéciale. Je suis cette structure de répertoire dans le contrôle de source.

project 
|-+ console 
| |-+ package 
|  |-- __init__.py, etc. 
|-+ viz 
    |-+ css 
    |-+ js 
    |-- index.html 

Je ne sais pas comment ce comportement peut être reproduit avec setup.py et les fichiers d'œufs.

  1. Comment puis-je faire en sorte que viz sera emballé? L'option package_data semble être relative à un package (impliquant que viz doit être placé sous un package). Par conséquent, package_data = {'': ['viz/*']} n'est pas ce que je cherche.

  2. Comment l'extraction est-elle effectuée?
    Dois-je utiliser pkg_resources.resource_filename pour obtenir viz dans le cache, puis shutil pour copier les fichiers à l'emplacement prévu? Y a-t-il une alternative plus pratique?

Répondre

0

Je considère changer toute la structure et en tournant viz dans un paquet, en déplaçant le code qui l'installe là aussi. Le résultat serait comme ça.

project 
|-- setup.py 
|-+ top-level-package 
    |-- __init__.py 
    |-+ console 
    | |-- __init__.py, etc. 
    |-+ viz 
     |-+ css 
     |-+ js 
     |-- index.html 
     |-- __init__.py 

Bien que cela aurait fonctionné, j'ai trouvé an answer qui fonctionne réellement pour mon but initial. setup.py doit copier récursivement les fichiers en tant que package_data (et les chemins relatifs fonctionnent avec ..).

def package_files(directory): 
    paths = [] 
    for (path, directories, filenames) in os.walk(directory): 
     for filename in filenames: 
      paths.append(os.path.join("..", path, filename)) 
    return paths 

extra_files = package_files("viz") # this is relative to the project root 

setup(
    ..., 
    package_data = {"mypackage": extra_files} 
) 

Je viens de la console et sont effondrés package dans l'original, de sorte que le paquet Python se trouve directement sous la racine du projet. C'est ma structure finale.

project 
|-- setup.py 
|-+ package 
| |-- __init__.py, etc. 
| |-+ private 
|  |-- ... 
|-+ viz 
    |-+ css 
    |-+ js 
    |-- index.html