2017-05-22 3 views
0

Ich versuche, ein Paket für mein Projekt zu erstellen, mit setup.py und setuptools. Eine allgemeine Suche hat vorgeschlagen, dass Datendateien unter meinem Python-Paket platziert werden sollten.
Zum Beispiel project/src/package/data.Installieren eines vollständigen Verzeichnisses von Datendateien

Aber meine Situation ist mehr im Einklang mit this question.

Mein Projekt besteht aus einer Python-Konsolenanwendung und einer interaktiven HTML-Anwendung. Gerade jetzt (vor setup.py) habe ich die Konsolenanwendung die HTML-Dateien mit einem speziellen Befehl in ein bestimmtes Verzeichnis kopieren. Ich folge dieser Verzeichnisstruktur in der Quellcodeverwaltung.

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

Ich bin mir nicht sicher, wie dieses Verhalten mit setup.py und Ei-Dateien repliziert werden kann.

  1. Wie kann ich sicherstellen, dass viz verpackt wird? Die package_data Option scheint relativ zu einem Paket zu sein (was bedeutet, dass viz sollte unter einem Paket platziert werden).

    Also, package_data = {'': ['viz/*']} ist nicht das, was ich suche.

  2. Wie erfolgt die Extraktion?
    Sollte ich pkg_resources.resource_filename verwenden, um viz in den Cache zu bekommen, und dann shutil, um die Dateien an den vorgesehenen Speicherort zu kopieren? Gibt es eine praktikablere Alternative?

Antwort

0

Ich betrachtete die ganze Struktur zu verändern und viz in ein Paket drehen, bewegen Sie den Code, es auch dort installiert. Das Ergebnis wäre so.

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

Während dies würde gearbeitet haben, fand ich an answer, die für meinen ursprünglichen Zweck tatsächlich funktioniert. setup.py muss rekursiv die Dateien als package_data kopieren (und die relativen Pfade arbeiten mit ..). direkt unter dem Projektstamm

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} 
) 

brach ich nur die ursprüngliche console und package in ein, so befindet sich das Python-Paket. Das ist meine letzte Struktur.

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