Python-Library um (Datei-)Abhängigkeiten zu modellieren?
Hallo allerseits, ich suche eine Library, mit der ich Abhängigkeiten zwischen Dateien und den von ihnen "include"-ten Dateien modellieren kann und mit der ich herausfinden kann, welche Dateien aktualisiert werden müssen, wenn sich eine von ihnen ändert. Also, wenn ich z.B. vier Dateien habe, die so aussehen (Pseudo-Code) // file-a include "file-b"; include "file-d" // file-b include "file-c"; // file-c bla bla dann sollte mir die Library, wenn ich sage, dass "file-c" sich geändert hat, zurückgeben, dass "file-a" aktualisert werden muss, und ebenso, wenn sich "file-b" oder "file-d" ändern. Die Äbhängigkeiten kann mein Code in dieser Form liefern: Datei Includes file-a file-b file-a file-d file-b file-c Kennt da jemand was, dass sich leicht in vorhandenen Code integrieren lässt und sich auch nicht zu viel anderen Ballast mitbringt (also nicht in sich geschlossene Frameworks wie z.B. Scons)? (Hintergrund: es geht um die on-demand Kompilierug von Sass-Dateien). Chris
On 2019-03-18 15:15, Christopher Arndt wrote:
ich suche eine Library, mit der ich Abhängigkeiten zwischen Dateien und den von ihnen "include"-ten Dateien modellieren kann und mit der ich herausfinden kann, welche Dateien aktualisiert werden müssen, wenn sich eine von ihnen ändert. [...]
Ich kenne zwar keine Library für genau diesen Anwendungsfall, aber das klingt für mich nach einem gerichteten Graphen, in dem die Knoten die Dateien und die Kanten die Relation "hängt ab von" sind. Du könntest mit einer Graphen-Bibliothek deinen Graphen anlegen und dann traversieren. Ich kann mir auch gut vorstellen, dass es schon Funktionen gibt, die näher an dem dran sind, was du haben willst (à la "gib mir alle Abhängigkeiten ausgehend von Knoten X"). Gegebenenfalls musst du dir überlegen, wie du mit zyklischen Abhängigkeiten umgehst, auch wenn die in deinem Fall natürlich nicht vorkommen "sollten", aber je nach den Dateien könnte sich sowas ergeben. An Graphen-Bibliotheken habe ich folgende Treffer gefunden: https://networkx.github.io/ (hatte ich auch schon oft gehört) https://igraph.org/ https://graph-tool.skewed.de/ Und hier noch eine Übersicht im Python-Wiki: https://wiki.python.org/moin/PythonGraphLibraries
Kennt da jemand was, dass sich leicht in vorhandenen Code integrieren lässt und sich auch nicht zu viel anderen Ballast mitbringt (also nicht in sich geschlossene Frameworks wie z.B. Scons)?
Ob dir die obigen Bibliotheken zu viel Ballast sind, musst du letztlich selbst beurteilen. :-) Viele Grüße Stefan
Am 18.03.19 um 19:04 schrieb Stefan Schwarzer:
On 2019-03-18 15:15, Christopher Arndt wrote:
ich suche eine Library, mit der ich Abhängigkeiten zwischen Dateien und den von ihnen "include"-ten Dateien modellieren kann und mit der ich herausfinden kann, welche Dateien aktualisiert werden müssen, wenn sich eine von ihnen ändert. [...]
Ich kenne zwar keine Library für genau diesen Anwendungsfall, aber das klingt für mich nach einem gerichteten Graphen, [...]
Stimmt, guter Hinweis. Da fiel mir ein, dass ich schon mal selbst ein rudimentäres Modul geschrieben habe, um Graphen abzubilden. Das habe ich mal für diesen Anwendungsfall verwendet. Falls es jemand interessiert: https://gist.github.com/SpotlightKid/ce66bb65c9a0adc966f0950c24feed9f Beim Durchdenken des o.g. Problems ist mir aber aufgefallen, dass es mit einem einmaligen Aufbau des Graphen nicht getan ist, man muss auch gelöschte und hinzugekommene Include-Dateien berücksichtigen und den Graphen aktualisieren oder neu aufbauen. Da ich aber die .sass/.scss Dateien sowieso kompilieren muss, um die Abhängigkeiten herauszufinden, frage ich mich, ob sich der Aufwand überhaupt lohnt bzw. ob ich nicht doch ein externes Tool wie Scons einbinden soll. Es sollte halt nur auch funktionieren, wenn es von einem Flask-Server im Development Mode, der unter Windows läuft, aufgerufen wird (und kein NodeJS oder Ruby benötigen). Grüße, Chris
Hallo Chris, Am 18.03.19 um 15:15 schrieb Christopher Arndt:
Die Äbhängigkeiten kann mein Code in dieser Form liefern:
Datei Includes file-a file-b file-a file-d file-b file-c
Kennt da jemand was, dass sich leicht in vorhandenen Code integrieren lässt und sich auch nicht zu viel anderen Ballast mitbringt (also nicht in sich geschlossene Frameworks wie z.B. Scons)?
(Hintergrund: es geht um die on-demand Kompilierug von Sass-Dateien).
Vor diesem Hintergrund will ich mal doit in den Raum werfen: http://pydoit.org/ Es ist ein Automatisierungs-Werkzeug, welches iirc als Alternative zu make die Welt erblickt hat und erlaubt in den Tasks Beziehungen anzugeben (einfaches Beispiel ist tatsächlich sowas wie Datei X benötigt Dateien Y und Z, wenn sich X oder Z ändern muss X neu erstellt werden; mehr Infos in der Doku: http://pydoit.org/tasks.html#dependencies-targets). Auf den ersten Blick etwas mehr Code als bei make, aber doit ist extrem flexibel und Tasks lassen sich auch zur Laufzeit dynamisch erstellen (http://pydoit.org/task_creation.html?highlight=create_doit_tasks). Tasks müssen dabei nicht zwingend Kommandozeilen-Aufrufe sein. Ich nutze es unter Linux und dort Support für inotify, welches einen auto/dev mode ermöglicht (http://pydoit.org/cmd_other.html#auto-watch). Es lässt sich in andere Tools integrieren (als Einstieg http://pydoit.org/cmd_run.html#using-the-api), rein als library habe ich es bisher aber noch nicht verwendet. Gruß Niko
Am 21.03.19 um 16:50 schrieb Niko Wenselowski:
Vor diesem Hintergrund will ich mal doit in den Raum werfen: http://pydoit.org/
Doit kenne ich von Nikola (https://getnikola.com). Ich schaue mir das nochmal in Hinblick auf meine Anforderungen an. Danke. Gruß, Chris
participants (3)
-
Christopher Arndt
-
Niko Wenselowski
-
Stefan Schwarzer