2013-03-06 13 views
6

Ich bin neu bei Scons und Python. Ich frage mich, ob es eine Möglichkeit gibt, scons aus einem Python-Skript heraus aufzurufen.Scons aus einem Python-Skript aufrufen

Mein Python-Skript akzeptiert vom Benutzer eine Liste von Verzeichnissen, in denen sich der zu kompilierende Code befindet (zusätzlich zu einigen anderen nicht-trivialen Dingen). Es generiert auch eine Zeichenfolge, die als Name der ausführbaren Datei von SCONS verwendet werden soll.

Ich möchte diese Informationen von meinem Python-Skript an Scons übergeben und dann Scons aufrufen. Gibt es eine einfache Möglichkeit, dies zu tun?

ich die folgenden Möglichkeiten denken kann:

  • Verwendung subprocess.call("scons"...) Ich bin nicht sicher, ob scons alle Informationen, die ich als Befehlszeilenargumente übergeben muß akzeptiert
  • den Python-Skript haben, schreiben in eine Datei . Lassen Sie das SConscript die Datei analysieren und die Informationen erhalten.

Antwort

2

Ich habe dies mit der subprocess.call() Python-Funktion gemacht, um die etwas langen und komplexen Befehlszeilenargumente einzukapseln, die für das jeweilige Projekt, an dem ich gerade arbeitete, benötigt wurden. Es gibt solche, die argumentierten, dass der Aufruf einfacher hätte sein sollen, damit er nicht eingekapselt werden muss, aber das ist ein anderes Thema :)

Eine Option, die anstelle von Befehlszeilenargumenten in Betracht gezogen wird, ist die SCONSFLAGS Umgebungsvariable erwähnt here. Persönlich bevorzuge ich diese Option nicht.

Alle Optionen, die Sie benötigen, können als Befehlszeilenoptionen übergeben werden. Eine gute Möglichkeit, SCons Befehlszeilenargumente anzupassen und zu handhaben, ist die Funktion SCON AddOption(). Zusätzlich können Sie einfache variable=value Variablen erhalten, indem Sie die SCONs ARGUMENTS dictionary verwenden. Andere verwandte SCons-Befehlszeilenfunktionen sind GetOption() und SetOption().

In Bezug auf die Übergabe einer Zeichenfolge für den Namen der ausführbaren Datei: SCons möglicherweise nicht so. Angenommen, Sie führen Ihr Skript einmal mit einer bestimmten ausführbaren Zeichenfolge aus, dann ein zweites Mal mit einer anderen, dann möchten Sie bereinigen, sodass Sie möglicherweise ausführbare Dateien zurücklassen, wenn SCON nicht mit demselben ausführbaren Namen ausgeführt wird.

3

Nun, ich denke, es ist theoretisch möglich. Die scons ausführbare Datei selbst ist nur ein Python-Skript und führt nur SCons.Script.main() aus, nachdem sie die Variable sys.path geändert hat. Aber Sie müssten wahrscheinlich tief in die Quelle eintauchen, um wirklich zu verstehen, wie Sie Dinge tun können, die Sie wollen.

Eine viel sauberere Lösung ruft Ihr Skript aus der SConscript-Datei auf, was wahrscheinlich die beabsichtigte Verwendung ist und viel einfacher sein sollte.

+1

Ich schaute in direkt aufrufen 'SCons.Script.main()' einmal, und entschied, dass es nicht wert war. Ich legte den Anruf in einen Subprozess.call() 'Aufruf und Handhabung der Befehlszeilenargumente wie in meiner Antwort erwähnt. Ich glaube, dass der Versuch, das eigentliche SCON-Skript zu umgehen, zu einer Welt der Verletzung führen könnte. – Brady

+0

Ich denke, das beantwortet meine Frage nicht: Wenn ich mein Python-Skript vom SConscript aus anrufe, wie gebe ich ihm Informationen weiter, die ich gerade habe erhalten _before_conscones aufrufen? –

+0

Gibt es eine echte Notwendigkeit, Ihr Skript vor Scons aufzurufen? Sie können Ihr Skript als ein Modul aus der SConscript-Datei importieren und dann bei Bedarf ausführen, um die erforderlichen Eingaben vom Benutzer zu sammeln. Obwohl technisch nicht gleich, gibt es für den Benutzer keinen Unterschied. Wenn das keine Option ist, dann ist die von Brandy vorgeschlagene Route eine machbare Lösung. –

1

Danke für die Antworten. Ich endete mit dieser Methode:

Das Python-Skript schreibt eine Liste von Optionen in eine Textdatei, schließt es und ruft scons -f MySConscript_file mit einem Unterprozessaufruf auf. Der SConstruct liest Werte aus der Textdatei in eine Liste und verwendet sie.