Подтвердить что ты не робот

Могу ли я управлять архитектурой (32 бит против 64 бит) при создании исполняемого файла pyinstaller?

Короткий вопрос
Есть ли способ контролировать/гарантировать архитектуру (32 бит против 64 бит) при создании исполняемого файла pyinstaller?

Фон
Я перешел из py2exe в pyinstaller из-за отсутствия 64-битной поддержки, а также множества мелких вещей, с которыми мне трудно смотреть в прошлое. Поэтому на этой ноте я бы предпочел не возвращаться к ней. Я разработал два приложения, использующие Python 2.7 64bit, и у меня возникают проблемы с производительностью при работе на них 32-битных машинах.

Первый - это простой графический интерфейс wxPython (версия 2.9) и подключается к файлу DLL Windows для USB-драйвера. Это кажется "безопасным" для 32-разрядной версии, потому что нет модулей, которые имеют только 64-битный код. Однако это приложение при работе на 32-битной Windows XP имеет проблемы с производительностью при разговоре с USB-устройством.

Второе приложение намного больше, и я еще не пытался строить и запускать из-за страха перед проблемами архитектуры. Это приложение имеет только 64-битные модули (psycopg2 для одного), используемые в нем. Я хотел бы держаться подальше от попытки построить это, если невозможно запустить как 32-битный исполняемый файл.

Текущие мысли
Я считаю, что это возможно (если модули поддерживают 32 бит), запустив build.py с Python, принудительно в 32-битном режиме. Есть ли в этом смысл?

Обновление
У меня было несколько прорывов по первой программе, которую я строил. Оказывается, проблемы с производительностью основывались исключительно на скорости двух машин. Моя машина Dev имела достаточно мощности, чтобы опробовать USB-устройство достаточно быстро, а на гораздо более медленной тестовой платформе (Windows XP) этого не произошло.

Я исправил эту проблему, изменив способ опроса USB-порта. Теперь, когда это было исправлено, я мог запустить exe на обеих системах. При попытке создать исполняемый файл в виде одного файла возникла новая проблема. При запуске pyinstaller Build.py он загружает всю требуемую DLL, которую приложение должно запускать. Сначала это выглядело отлично, но когда я попытался запустить одиночный exe, который я построил на Windows 7 64bit, он не будет работать в Windows XP, потому что DLL-ключ USB-порта не был признан допустимой DLL.

Чтобы запустить один exe для работы в обеих системах, я сначала попытался удалить DLL из файла .spec(который выглядит как python script). Это было удобно, потому что я смог изменить список включений до команды сборки с помощью обычных модификаторов списка python. Я надеюсь, что если DLL не была найдена в каталоге exe temp, она найдет ее в системе PATH. Хотя этот подход может работать, я не мог заставить его работать без большого количества ошибок.

Моя вторая попытка состояла в том, чтобы создать приложение на компьютере под управлением Windows XP (оставив встроенную DLL) в надежде, что Windows XP будет работать в Windows 7. Успех! Эта конфигурация работает хорошо; однако я уверен, что это не лучшее решение, поскольку оно зависит исключительно от старой DLL, работающей на более новой ОС.

4b9b3361

Ответ 1

Pyinstaller создает двоичный файл в зависимости от питона, который вы использовали для его создания. Поэтому, если вы используете python 2.7 64 bit, то, насколько мне известно, невозможно создать 32-битный исполняемый файл. Это связано с тем, что Pyinstaller архивирует все модули и их зависимости (dll, pyds и т.д.), Которые являются 64-битными из-за установки python.

Как уже говорилось, из-за проблем с перекрестной совместимостью лучше создавать 32-битные двоичные файлы. Вероятно, вы можете задать более свой вопрос.

Ответ 2

Если вы создаете приложение и отлично работаете на 32-разрядной Windows, нет необходимости создавать 64-разрядную версию. Просто создайте 32-разрядную версию и запустите ее на обеих архитектурах. Для чего нужен WOW64.

Если вам нужно использовать библиотеку или функцию, которая имеет только 64-разрядную версию, просто создайте 64-разрядную версию. Нет смысла строить 32-разрядную версию, если эта функция имеет только 64-разрядную версию.

Единственная причина для сборки 64-разрядной и 32-разрядной версий - это использовать увеличенное адресное пространство 64-битных окон. То есть если вы намереваетесь выделить более 1 или 2 ГБ памяти. Примером может быть приложение для редактирования изображений или приложение для управления данными. Затем вы можете работать на 32-битных платформах в рамках ограничений платформы, но редактировать большие изображения или большее количество данных на 64-битных платформах.

IOW, для вашего случая следуйте предложению @Velociraptors и создайте 32-битный питон, если вы строите 32-разрядный exe.