Kompilieren eines IronPython-WPF-Projekts zum Ausführen von

Was ist der beste Weg, um eine IronPython-Anwendung für die Bereitstellung zu packen? Nachdem ich das Web durchforstet habe, benutze ich am bestenclr.CompileModules(), um die .py-Dateien meines gesamten Projekts zu einer .dll zusammenzufügen und dann ein einziges @ zu habrun.py Tun Sie dies, um die DLL auszuführen:

import clr
clr.AddReference('compiledapp.dll')

import app

Das ist aber immer noch nicht optimal, weil es bedeutet, dass ich

distribute 3-Dateien (das.dll, das.xaml, und dierun.py StartprogrammInstallieren Sie IronPython auf dem Hostcomputer

Plus, das fühlt sich so ... abgedreht an, nach der wunderbaren Integration, die IronPython bereits in Visual Studio 2010 vorgenommen hat. Ich bin völlig verblüfft, warum es kein integriertes Build-System für IPy-Apps gibt, da sich alles auf IL beschränkt .

Ideally, ich möchte in der Lage sein, ein einziges @ zu hab.exe mit dem.xaml irgendwie innerhalb zusammengeführt (ich habe gelesen, dass C # -Anwendungen XAML zu BAML kompilieren und sie in der ausführbaren Datei zusammenführen), und ohne dass IronPython installiert sein muss, um ausgeführt zu werden. Ist das zumindest zur Hälfte möglich? (Ich nehme an, es ist in Ordnung, wenn die Exe zusätzliche .DLLs benötigt oder so. Der wichtige Teil ist, dass sie in .exe-Form vorliegt.)

Einige Änderungen zur Verdeutlichung: Ich habe versucht pyc.py, aber es scheint nicht die Tatsache anzuerkennen, dass mein Projekt nicht nur @ iapp.py. Die Größe der exe, die es erzeugt, deutet darauf hin, dass es nur "kompiliert"app.py ohne eine der anderen Dateien in die exe aufzunehmen. Wie kann ich also festlegen, dass jede Datei in meinem Projekt kompiliert wird?

Um dies besser zu veranschaulichen, sehen Sie hier einen Screenshot des Lösungs-Explorers meines Projekts.

Edit II: Es scheint, dass leider der einzige Weg ist, @ zu verwendpyc.py und passjede einzelne Datei dazu als Parameter. Zu diesem Ansatz habe ich zwei Fragen:

Wie verarbeite ich möglicherweise eine so große Befehlszeile? Ein Befehl enthält maximal 256 Zeichen.Wie kann pyc.py die Paket- / Ordnerstruktur beibehalten? Wie in meinem obigen Projekt-Screenshot gezeigt, kann mein kompiliertes Programm auf Module zugreifen, die sich in Unterordnern befinden, z. B. auf DT \ Device? Ist die Hierarchie in der DLL irgendwie "erhalten"?

Edit III: Seit der Übergabe von 70 Dateinamen anpyc.py über die Befehlszeile wird unhandlich sein, und im Interesse der Lösung des Problems der eleganteren Erstellung von IPy-Projekten habe ich beschlossen, @ zu erweitepyc.py.

Ich habe Code hinzugefügt, der ein @ einlies.pyproj Datei durch die/pyproj: -Parameter, analysiert das XML und ruft von dort die Liste der im Projekt verwendeten Py-Dateien ab. Das hat ziemlich gut funktioniert; Die erzeugte ausführbare Datei scheint jedoch nicht in der Lage zu sein, auf die Python-Unterpakete (Unterordner) zuzugreifen, die Teil meines Projekts sind. Meine Version vonpyc.py Mit meinem.pyproj Lese-Support-Patch finden Sie hier:http: //pastebin.com/FgXbZY2

Wenn dieses neuepyc.py wird in meinem Projekt ausgeführt, dies ist die Ausgabe:

c:\Projects\GenScheme\GenScheme>"c:\Program Files (x86)\IronPython 2.7\ipy.exe"
pyc.py /pyproj:GenScheme.pyproj /out:App /main:app.py /target:exe
Input Files:
        c:\Projects\GenScheme\GenScheme\__init__.py
        c:\Projects\GenScheme\GenScheme\Agent.py
        c:\Projects\GenScheme\GenScheme\AIDisplay.py
        c:\Projects\GenScheme\GenScheme\app.py
        c:\Projects\GenScheme\GenScheme\BaseDevice.py
        c:\Projects\GenScheme\GenScheme\BaseManager.py
        c:\Projects\GenScheme\GenScheme\BaseSubSystem.py
        c:\Projects\GenScheme\GenScheme\ControlSchemes.py
        c:\Projects\GenScheme\GenScheme\Cu64\__init__.py
        c:\Projects\GenScheme\GenScheme\Cu64\agent.py
        c:\Projects\GenScheme\GenScheme\Cu64\aidisplays.py
        c:\Projects\GenScheme\GenScheme\Cu64\devmapper.py
        c:\Projects\GenScheme\GenScheme\Cu64\timedprocess.py
        c:\Projects\GenScheme\GenScheme\Cu64\ui.py
        c:\Projects\GenScheme\GenScheme\decorators.py
        c:\Projects\GenScheme\GenScheme\DeviceMapper.py
        c:\Projects\GenScheme\GenScheme\DT\__init__.py
        c:\Projects\GenScheme\GenScheme\DT\Device.py
        c:\Projects\GenScheme\GenScheme\DT\Manager.py
        c:\Projects\GenScheme\GenScheme\DT\SubSystem.py
        c:\Projects\GenScheme\GenScheme\excepts.py
        c:\Projects\GenScheme\GenScheme\FindName.py
        c:\Projects\GenScheme\GenScheme\GenScheme.py
        c:\Projects\GenScheme\GenScheme\PMX\__init__.py
        c:\Projects\GenScheme\GenScheme\PMX\Device.py
        c:\Projects\GenScheme\GenScheme\PMX\Manager.py
        c:\Projects\GenScheme\GenScheme\PMX\SubSystem.py
        c:\Projects\GenScheme\GenScheme\pyevent.py
        c:\Projects\GenScheme\GenScheme\Scheme.py
        c:\Projects\GenScheme\GenScheme\Simulated\__init__.py
        c:\Projects\GenScheme\GenScheme\Simulated\Device.py
        c:\Projects\GenScheme\GenScheme\Simulated\SubSystem.py
        c:\Projects\GenScheme\GenScheme\speech.py
        c:\Projects\GenScheme\GenScheme\stdoutWriter.py
        c:\Projects\GenScheme\GenScheme\Step.py
        c:\Projects\GenScheme\GenScheme\TimedProcess.py
        c:\Projects\GenScheme\GenScheme\UI.py
        c:\Projects\GenScheme\GenScheme\VirtualSubSystem.py
        c:\Projects\GenScheme\GenScheme\Waddle.py
Output:
        App
Target:
        ConsoleApplication
Platform:
        ILOnly
Machine:
        I386
Compiling...
Saved to App

So liest es richtig in der Liste der Dateien in der.pyproj... Groß! Aber das Ausführen der Exe gibt mir Folgendes:

Unhandled Exception: IronPython.Runtime.Exceptions.ImportException: 
No module named Cu64.ui

ObwohlCu64\ui.py ist offensichtlich in der Kompilierung enthalten, die Exe kann es nicht finden, wenn sie ausgeführt wird. Dies ist, was ich in Punkt 2 in der vorherigen Ausgabe befürchtet hatte. Wie behalte ich die Pakethierarchie meines Projekts bei? Vielleicht muss jedes Paket einzeln kompiliert werden?

Ich werde das Kopfgeld für diese Frage verlängern. Letztendlich hoffe ich, dass wir eine funktionierende pyc.py bekommen, die pyproj-Dateien einliest und funktionierende exes in einem Schritt erzeugt. Dann könnte es vielleicht sogar an IronPythons Codeplex geschickt werden, um in die nächste Veröffentlichung aufgenommen zu werden ...;]

Antworten auf die Frage(10)

Ihre Antwort auf die Frage