Каков наилучший способ упаковки приложения IronPython для развертывания? После просмотра веб-страниц лучшее, что я придумал (и то, что я сейчас делаю), это использование clr.CompileModules()
для склейки файлов .py всего моего проекта в одну .dll, а затем использование одного run.py
do это для запуска DLL:
import clr
clr.AddReference('compiledapp.dll')
import app
Это все еще неоптимально, потому что это означает, что я должен
- распространяет 3 файла (
.dll
, .xaml
и run.py
launcher)
- установить IronPython на хост-машину
Плюс, это выглядит так ... хакерски, после замечательной интеграции IronPython с Visual Studio 2010. Я совершенно не понимаю, почему не существует интегрированной системы сборки для приложений IPy, поскольку все сводится к ИЛ в любом случае.
В идеале я хочу иметь возможность объединить один .exe
с .xaml
внутри (я читал, что приложения C # компилируют XAML в BAML и объединяют их в исполняемый файл), и при этом не требуется установка IronPython бежать. Возможно ли это хотя бы на полпути? (Я полагаю, что все в порядке, если exe-файл нуждается в дополнительных .DLL с ним или чем-то еще. Важной частью является то, что он находится в форме .exe.)
Некоторые правки, чтобы уточнить: Я пробовал pyc.py , но, похоже, не признает тот факт, что мой проект не просто app.py
. Размер исполняемого файла предполагает, что он просто «компилирует» app.py
без включения каких-либо других файлов в исполняемый файл. Итак, как мне сказать, чтобы компилировать каждый файл в моем проекте?
Чтобы помочь визуализировать это, вот скриншот окна обозревателя решений моего проекта.
Редактировать II: Кажется, что, к сожалению, единственный способ - использовать pyc.py
и передавать каждый отдельный файл в качестве параметра. У меня есть два вопроса для этого подхода:
- Как мне обработать такую большую командную строку? В команде максимум 256 символов.
- Как pyc.py узнает, как сохранить структуру пакета / папки? Как показано на скриншоте моего проекта выше, как моя скомпилированная программа узнает, как получить доступ к модулям, которые находятся в подпапках, например, получить доступ к DT \ Device? Сохранена ли иерархия как-то в dll?
Редактировать III : Поскольку передача 70 имен файлов в pyc.py
через командную строку будет громоздкой, и в интересах более элегантного решения проблемы создания проектов IPy, я решил дополнить pyc.py
.
Я добавил код, который читает файл .pyproj
через параметр /pyproj:
, анализирует XML и получает оттуда список py-файлов, используемых в проекте. Это работает довольно хорошо; однако производимый исполняемый файл, похоже, не может получить доступ к подпакетам (подпапкам) Python, которые являются частью моего проекта. Моя версия pyc.py
с моим патчем поддержки чтения .pyproj
может быть найдена здесь: http://pastebin.com/FgXbZY29
Когда этот новый pyc.py
запущен в моем проекте, это вывод:
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
Так что правильно читайте в списке файлов в .pyproj
... Отлично! Но запуск exe дает мне это:
Unhandled Exception: IronPython.Runtime.Exceptions.ImportException:
No module named Cu64.ui
Так что, хотя Cu64\ui.py
явно включен в компиляцию, исполняемый файл не может его найти. Это то, чего я боялся в пункте № 2 в предыдущем редактировании. Как мне сохранить иерархию пакетов моего проекта? Возможно, может потребоваться отдельная компиляция каждого пакета?
Я продлю награду за этот вопрос. В конечном счете, я надеюсь, что мы сможем получить рабочий pyc.py, который читает файлы pyproj и создает рабочие exe за один шаг. Тогда, может быть, он даже может быть отправлен в кодовый комплекс IronPython для включения в следующий выпуск ...;]