Используйте интерпретатор Python, упакованный с py2exe

У меня есть скрипт Python, который я хочу распространить в Windows, где у людей может не быть установлен Python. Поэтому я использую py2exe. Проблема заключается в сценарии, в котором я запускаю другие сценарии Python, используя подпроцесс, который требует интерпретатора Python в качестве программы для выполнения. Поскольку у меня не установлен интерпретатор python в Windows, могу ли я каким-либо образом игнорировать интерпретатор и обойти проблему? Можно ли как-нибудь вызвать интерпретатор Python, упакованный py2exe?


person Nick    schedule 12.07.2011    source источник


Ответы (1)


Вероятно, это проще, чем вы думаете: вместо запуска подпроцессов используйте встроенную команду eval() для выполнения сценариев.

[EDIT] Чтобы перенаправить stdio, замените sys.stdout/ sys.stderr с буферами или чем-то еще, что поддерживает "write()".

Для восстановления исходных значений модуль sys предлагает __stdout__ и т. д.

[EDIT2] Я не пробовал это, но это может сработать: добавьте «python.exe» в набор файлов, которые создает py2exe.

Из основного кода скопируйте все файлы, созданные py2exe + python.exe во временный каталог. Затем добавьте все свои сценарии.

Теперь запустите новый интерпретатор Python с небольшим скриптом, который добавит временную папку и library.zip в папку sys.path.

Примечание. Python не нужно «устанавливать», как приложение Windows. На самом деле можно просто скопировать все файлы на новое место. Пока путь поиска правильный, это работает.

person Aaron Digulla    schedule 12.07.2011
comment
Спасибо за ваш быстрый ответ. Я мог бы использовать eval, exec или execfile (это, вероятно, правильный вариант), чтобы сделать это, но я склонен запускать его в другом процессе, поскольку основным процессом является программа PyQt, и я хочу поймать вывод скрипта Python, работающего в подпроцесс и показать вывод в основном процессе. - person Nick; 12.07.2011
comment
Одна сложность, о которой следует помнить: в этом сценарии py2exe не знает, какие модули Python могут понадобиться этим сценариям evaled. Вам нужно будет сообщить py2exe, чтобы он связал все дополнительные необходимые модули. - person Craig McQueen; 12.07.2011
comment
@Nick: перенаправь stdio и используй поток, чтобы он не блокировался. Но есть и другие ограничения (например, когда сценарии вызывают sys.exit()). - person Aaron Digulla; 12.07.2011
comment
Я добавил еще один вариант, который вы можете попробовать. - person Aaron Digulla; 12.07.2011
comment
Спасибо, это выглядит очень многообещающе. Я попробую и дам вам знать. - person Nick; 12.07.2011
comment
Я не пробовал править 1, потому что редактирование 2 сработало! Это довольно удивительно, потому что все, что я сделал, это скопировал интерпретатор Python в папку и настроил sys.path. - person Nick; 13.07.2011
comment
Разве не приятно, как просто решить многие проблемы в Python? :-) - person Aaron Digulla; 13.07.2011
comment
Эй, я застрял в той же ситуации. Можете ли вы объяснить, что вы имеете в виду под «Добавить python.exe в набор файлов, которые создает py2exe»? Потому что я не могу понять это. Я пытаюсь сделать что-то вроде: console = [{'script': 'bin/app.py'}, 'python.exe'], но это явно не работает. Однако у меня мало опыта работы с py2exe. - person Bogdan; 16.09.2011